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 ...
随机推荐
- ACM Ignatius and the Princess I
公主被BEelzebub feng5166绑架,我们的英雄Ignatius必须拯救我们美丽的公主. 现在他进入feng5166的城堡.城堡是一个大迷宫.为简单起见,( To make the prob ...
- 两个activity之间透明过渡效果和经验
来看下效果图: 大致效果解释: 1. 当用户点击登录时logo下滑一定距离 2. 下滑后旋转90时 变化图标 3. 继续旋转90度 4. 然后移动到左上角 透明度渐变到上个activity 最后销毁当 ...
- Apache ActiveMQ实战(2)-集群
ActiveMQ的集群 内嵌代理所引发的问题: 消息过载 管理混乱 如何解决这些问题--集群的两种方式: Master slave Broker clusters ActiveMQ的集群有两种方式: ...
- hive表的存储格式; ORC格式的使用
hive表的源文件存储格式有几类: 1.TEXTFILE 默认格式,建表时不指定默认为这个格式,导入数据时会直接把数据文件拷贝到hdfs上不进行处理.源文件可以直接通过hadoop fs -cat 查 ...
- MacOS获取辅助功能权限控制鼠标点击事件
昨晚玩一个模拟经营的游戏,由于升级太慢我就不停的种树卖树来换取经验值.不过重复点击10几分钟后,实在受不了.网上本来准备找个鼠标自动点击的软件用用.结果没找到趁手的.如是自己写了个. 自己设置需要点击 ...
- 【ShaderToy】水彩画
写在前面 好久没有更新shadertoy系列了,我万万没想到有童鞋还惦记着它...之前说过希望可以一周更新一篇,现在看来是不怎么可能了,一个月更新一篇的希望比较大(不要再相信我了...) 我把之前实现 ...
- 1.使用C++封装一个链表类LinkList
使用C++封装一个链表类LinkList.写出相应一个测试用例 链表需要提供 添加 修改删除 除重 合并 排序创建 销毁等接口. 不能调用库函数或者使用STL等类库 题目延伸********** ...
- Python Skelve 库
在Python中有一个简单的轻量级的类似于Key-value的存储型数据库,那就是Skelve.下面就来一起看一看这个库的简单的使用吧. 小例子 我本人比较喜欢从例子出发,然后再来研究这些内部的行为. ...
- 【IOS 开发】基本 UI 控件详解 (UISegmentedControl | UIImageView | UIProgressView | UISlider | UIAlertView )
转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/50163725 一. 分段控件 (UISegmentedControl) 控件展 ...
- J2EE进阶(八)Hibernate与延迟加载机制探究
Hibernate与延迟加载机制探究 前言 Hibernate对象关系映射提供延迟的与非延迟的对象初始化.非延迟加载在读取一个对象的时候会将与这个对象所有相关的其他对象一起读取出来.这有时会导致成百的 ...