Leetcode_88_Merge Sorted Array
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/41631609
通过本文你可能学到的知识为:
(1)当我们遇到问题从正面不能或者无法解决时,不要钻进去了出不来,而是静下心来,考虑能否从其反面出发来解决问题。
(2)很多时候,我们的时间不是浪费在正确的思考上,而是浪费在无用的思考上面。
(3)针对问题,必须彻底弄清里面的逻辑后,再着手进行编码,而不是尝试使用不确定的逻辑来编码,那样浪费时间和精力。
(4)通过算法题,进一步分析从反面思考的重要性。
可能大家都知道,软件开发真正耗费时间的并不是编码,而是前期的分析和后期的维护。针对开发人员来说,前期的分析却至关重要,其关系着后续维护的难度和处理起来的效率。对于前期的分析和设计,我觉得最重要的应该是逻辑(可能是我本人有一段时间学习过逻辑的原因吧),我一直认为,如果代码的逻辑性特别好,比较严密的话,基本不会出现大量的Bug和问题,因为逻辑具有连贯性,从一方面到另一方面的来龙去脉你能够看的很清晰,这样即使是出现问题了,也能够很快的解决。其实从面向对象程序设计的角度来看,逻辑性好的代码应该是抽象的,而不是具体的,总是让代码依赖于抽象,这样不管后续是怎么的变化,代码还是很牢固的,不至于添加或者修改而变得面目全非。总之,无论在做什么事之前,一定要搞清楚里面的逻辑关系,就像代码中类和类之间的关系一样,那样我们才能轻松地操控代码,而不是代码来操控我们做改变。(后续我会写一篇《论逻辑在编程中的重要性》分享给大家,目前在还在构思,这些都是我自己的一些感悟,希望对你有所帮助)。
Merge Sorted Array
Given two sorted integer arrays A and B, merge B into A as one sorted array.
Note:
You may assume that A has enough space (size that is greater or equal to m + n) to hold additional elements from B. The number of elements initialized in A and B are m andn respectively.
思路:
(1)题意为:给定两个排好序的int[]数组,将其合并为一个有序的数组。
(2)这里会出现两种情况:一种情况是从数组前面分别往后遍历,并进行比较;另一种情况是从数组后面分别往前进行遍历。
(3 可能大家的最初的想法是从数组前面往后进行遍历,这属于正常思维。但是这样做需要创建数组申请额外的空间,虽然题意没有限制,但是如果其进
行限制,你又该如何解决。我想大多数人还是会绞尽脑汁地想办法从前面进行遍历,可能最后也能找到解决方法,但是却浪费了不少时间。
(4)如果你能够考虑从后面出发,运用“正难则反”的思想,依次往前进行比较,你就会发现题目会变得简单。其实是逻辑变得简单了,而从前往后的解题
思路在逻辑上相对要比从后往前复杂一些。且从后往前进行遍历不需为创建数组而申请空间,且效率要比从前往后稍高一些。
(5)可知,当我们遇到难题时,不要一味地沿着一条路往下走,可以尝试着换一种思考方式,或从其反面出发,就像我们在做数学证明题一样,当我们遇
到“最多”、“最少”的问题时,老师教给我的方法不也是尝试从其反面进行考虑,那样,也许能够更快地解决问题,从而节省时间。
(6)从反往前进行遍历的解题算法和从前往后进行遍历的解题算法如下所示。
如果从反面(后往前)进行考虑,算法的代码实现如下(PS:希望对你有所帮助,也希望能遇到志同道合的人,进行更多地交流)。
public static void merge(int A[], int m, int B[], int n) {
if (n == 0)
return;
if (m == 0 && n != 0) {
for (int i = 0; i < n; i++) {
A[i] = B[i];
}
}
int i = m - 1; //数组A最大下标
int j = n - 1; //数组B最大下标
int k = m + n - 1; //数组A和数组B组合后的最大下标
while (i >= 0 && j >= 0) {
if (A[i] > B[j]) { //分别从A和B最后的元素开始向前比较
A[k] = A[i]; //如果A[i]较大,将A[i]值放在A和B组合后的最后位置
i--; //i左移1位
} else {
A[k] = B[j];
j--;
}
k--;
}
while (i >= 0) { //说明数组A长度大于数组B,需将其剩余元素追加上
A[k] = A[i];
i--;
k--;
}
while (j >= 0) {
A[k] = B[j];
j--;
k--;
}
}
如果从正面(前往后)进行考虑,算法的代码实现如下:
public static void merge(int A[], int m, int B[], int n) {
if (n == 0)
return;
if (m == 0 && n != 0) {
for (int i = 0; i < n; i++) {
A[i] = B[i];
}
}
int i = 0; // A m
int j = 0; // B n
int k = 0;
int[] x = new int[m + n]; // 需要创建一个数组来存储比较后的值
while (i < m && j < n) {
if (A[i] <= B[j]) {
x[k++] = A[i++];
} else {
x[k++] = B[j++];
}
}
while (i < m) {
x[k++] = A[i++];
}
while (j < n) {
x[k++] = B[j++];
}
for (int t = 0; t < x.length; t++) {
A[t] = x[t];
}
}
Leetcode_88_Merge Sorted Array的更多相关文章
- Merge Sorted Array
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...
- [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二
Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...
- [LeetCode] Find Minimum in Rotated Sorted Array 寻找旋转有序数组的最小值
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- [LeetCode] Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树
Given an array where elements are sorted in ascending order, convert it to a height balanced BST. 这道 ...
- [LeetCode] Merge Sorted Array 混合插入有序数组
Given two sorted integer arrays A and B, merge B into A as one sorted array. Note:You may assume tha ...
- [LeetCode] Search in Rotated Sorted Array II 在旋转有序数组中搜索之二
Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...
- [LeetCode] Remove Duplicates from Sorted Array II 有序数组中去除重复项之二
Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ...
- [LeetCode] Search in Rotated Sorted Array 在旋转有序数组中搜索
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- [LeetCode] Remove Duplicates from Sorted Array 有序数组中去除重复项
Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...
随机推荐
- Linux 查看CPU温度
安装 lm-sensors sudo apt-get install lm-sensors # 安装yes | sudo sensors-detect # 侦测所有感测器 sensors # 查看温度 ...
- Python练习之pillow
此系列意在记录于一些有趣的程序及对其的总结. 问题来源: https://github.com/Yixiaohan/show-me-the-code https://github.com/HT524/ ...
- MongoDB 复制(副本集)
MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬件故障和服务中断中恢复数据. ...
- Docker有用的资源
资源链接 Docker 主站点: https://www.docker.io Docker 注册中心API: http://docs.docker.com/reference/api/registry ...
- JMETER_从入门到放弃系列
基础篇 Jmeter(一)_环境部署 Jmeter(二)_基础元件 Jmeter(三)_配置元件 Jmeter(四)_16个逻辑控制器 Jmeter(五)_24个函数 Jmeter(六)_前置处理器 ...
- API得到Windows版本
API得到Windows版本 /** * Windows Version * https://msdn.microsoft.com/en-us/library/windows/desktop/dn48 ...
- Android开发学习之路--Java和Js互相调用
随着前端的火热,以前开发的快速,越来越多的native app在其中融合了h5,就拿淘宝就是很多的h5组成的,一旦出现什么节日,他都可以不用通过更新app来实现界面的改变,而且android和io ...
- ZooKeeper之(三)工作原理
3.1 系统架构 ZooKeeper集群是由多台机器组成的,每台机器都充当了特定的角色,各种角色在协作过程中履行自己的任务,从而对外提供稳定.可靠的服务. 由上图可知,ZooKeeper集群由多台机器 ...
- 从Stage角度看cassandra write
声明 文章发布于CSDN cassandra concurrent 具体实现 cassandra并发技术文中介绍了java的concurrent实现,这里介绍cassandra如何基于java实现ca ...
- [CSDN_Markdown] Markdown基本语法
简介 本文介绍Markdown的基本使用方法: 使用标题 加粗.斜体 分割线 列表 引用 我写博客一般将可以独立的内容分节,每一节有一个标题,标题的字体应该与正文的字体有点区别.两个相邻节之间使用分割 ...