本文是在学习中的总结,欢迎转载但请注明出处: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. 解决linux中使用git,ssh每次都要输入密码

    在linux中使用git,去提交或者下载代码都是很方便的,但是最近新配置了一套系统,发现每次git pull或者其他动作都需要输入密码. 想一想不对劲啊,我使用的是ssh的方式clone的代码,而且在 ...

  2. if-case-循环语句

    IF语句 drop procedure if exists p_hello_world; create procedure p_hello_world(in v_id int) begin ) the ...

  3. Minimize the error CodeForces - 960B

    You are given two arrays A and B, each of size n. The error, E, between these two arrays is defined  ...

  4. 【事务】<查询不到同一调用方法其它事务提交的更新>解决方案

    最近遇到一个很棘手的问题,至今也解释不清楚原因,不过已经找到了解决方案. 先来看看Propagation属性的值含义,@Transactional中Propagation属性有7个选项可供选择: Pr ...

  5. webpack 1.x 配合npm scripts管理多站点

    需求场景: 希望通过一个webpack文件夹管理多个站点的打包流程. 假设现在我要为站点domain配置打包流程. npm 添加淘宝镜像 你懂得 vim ~/.npmrc registry = htt ...

  6. Dynamics CRM Entity Relationship Many to Many (N:N)

    该博客对N:N的关系的查询列出了两种方式,一种RetrieveMultipleRequest,一种Fetch XML ,有谁对N:N关系的查询了解不是很深的可以学习下. http://andreasw ...

  7. Angularjs + Bootstrap 制作的一个TODO List

    看了一个关于Angularjs的视频,视频内容讲解的是如何制作一款TODO list形式的SPA(Simple Page Application,单页面应用).为了增强理解,下面写了一篇文章,用以复习 ...

  8. Unity3d导出场景地图寻路

    Unity3d导出场景地图寻路(金庆的专栏)Unity3d中用无渲染的透明盒子摆出地面和阻档区域.        this.renderer.enabled = false;所有这些盒子设为Navig ...

  9. Python尾递归-创始人为何不愿TRE以及我们如何模拟TRE

    TRE=Tail Recursion Elimination 创始人是不愿意实现TRE的.他专门用了一篇文章来阐述原因. http://neopythonic.blogspot.com/2009/04 ...

  10. Oracle 大数据集成实施

    Oracle 大数据实施架构 Oracle为广大客户提供了一个预装的用于测试和学习目的的免费大数据环境.你可以在这个环境中对Oracle大数据一体机(Big Data Appliance)上的可选软件 ...