本文是在学习中的总结,欢迎转载但请注明出处: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的更多相关文章

  1. Merge Sorted Array

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...

  2. [LeetCode] Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二

    Follow up for "Find Minimum in Rotated Sorted Array":What if duplicates are allowed? Would ...

  3. [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 ...

  4. [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. 这道 ...

  5. [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 ...

  6. [LeetCode] Search in Rotated Sorted Array II 在旋转有序数组中搜索之二

    Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this ...

  7. [LeetCode] Remove Duplicates from Sorted Array II 有序数组中去除重复项之二

    Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ...

  8. [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 ...

  9. [LeetCode] Remove Duplicates from Sorted Array 有序数组中去除重复项

    Given a sorted array, remove the duplicates in place such that each element appear only once and ret ...

随机推荐

  1. kafka简单回顾

    先说说遇到的坑 回顾下kafka topic:生产组:P0\P1----P14 一个消费组:c0 c1 c2 依据Consumer的负载均衡分配 消费顺序"c0:p0-p4 c1:p5-p9 ...

  2. C++后台实践:古老的CGI与Web开发

    本文写给C/C++程序猿,也适合其他对历史感兴趣的程序猿 ============================================= 谈到web开发,大家首先想到的PHP.JavaEE ...

  3. ThreadLocal深入剖析

    JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...

  4. Mac小技巧:快速查看指定应用程序的所有窗口

    我们知道在Mac中快速在系统所有程序中切换得快捷键为: cmd + tab 不过有时我们需要快速查看某一个程序的所有窗口,那又该如何呢? 以下方法在MacOS 10.12中测试成功! Mac默认该功能 ...

  5. 剑指Offer——知识点储备-设计模式

    剑指Offer--知识点储备-设计模式 设计模式 设计模式的六大原则 (1)单一职责原则(有且仅有一个原因引起类的变化): (2)里氏替换(任何父类出现的地方子类都可以替换): (3)依赖倒置(依赖抽 ...

  6. python 列表解析与map和filter函数

    不知哪儿看到一个说法,大概是当map的函数参数可以直接引用一个已有的函数变量时(比如内建函数int,str之类的),用map更优美些,否则还是用列表解析更直观和快速. 我同意此说法. 昨天在写一个函数 ...

  7. Spring+EhCache缓存实例(详细讲解+源码下载)

    一.ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架,具有快速.精干等特点,是Hibernate中默认的CacheProvider.Ehcache是一种广泛使用的开源Java分布式 ...

  8. C/C++与Matlab混合编程初探

    ================================================================== % 欢迎转载,尊重原创,所以转载请注明出处. % http://b ...

  9. Swift中声明协议中的class关键字的作用

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 最近在Cocos2D编程for Swift中看到以下一个代码片 ...

  10. 第一行代码阅读笔记---AndroidMainfest.xml分析

    按照这本书的指引,我随作者一样创建了一个安卓应用,开始了安卓开发的启程. 找到AndroidMainfest.xml这个文件,打开后看到了我创建的Activity在这个文件里被成功注册,文件内容如下: ...