本文是在学习中的总结,欢迎转载但请注明出处: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. 给定桩号获取纵断面中的高程值(c# for civil3d)

    通过civil3d提供的api,也就是纵断面Profile类提供的方法---public double ElevationAt(double station),就可以很轻松的获取纵断面对象某桩号处的高 ...

  2. ionic tab页面跳转

    要使用到Tabs,现将Tabs导入 import { NavController, ModalController, Tabs } from 'ionic-angular'; 把要选择的Tabs页面的 ...

  3. 使用POI实现报表打印功能

    [版权申明:本文系作者原创,转载请注明出处] 文章出处:http://blog.csdn.net/sdksdk0/article/details/53393453 作者:朱培 ID:sdksdk0 这 ...

  4. 【Java集合系列】---总体框架

    个的组合,这些数据项可能共享某些特征,需要以某种操作方式一起进行操作,一般来说,这些数据项的类型都是相同的,或者基类相同(若使用的语言支持继承),列表或数组通常不认为是集合,因为其大小固定,但是事实上 ...

  5. SpringMVC+Spring+Mybatis整合,使用druid连接池,声明式事务,maven配置

    一直对springmvc和mybatis挺怀念的,最近想自己再搭建下框架,然后写点什么. 暂时没有整合缓存,druid也没有做ip地址的过滤.Spring的AOP简单配置了下,也还没具体弄,不知道能不 ...

  6. 快速排序quick_sort(python的两种实现方式)

    排序算法有很多,目前最好的是quick_sort:unstable,spatial complexity is nlogN. 快速排序原理 python实现 严蔚敏的 datastruct书中有伪代码 ...

  7. CentOS7.2安装Weblogic12c出现的问题

    Weblogic12c安装到步骤:Prerequisite  Checks 时,会进行操作系统版本的校验,即checking  operating  system  certification. 此处 ...

  8. [django]用fastcgi部署

    django官方已经开始弃用fastcgi来部署django应用了,作为以前使用过的用户,还是贴一个配置,用来做纪念吧.. 项目下 #! /bin/sh case "$@" in ...

  9. 阻尼回弹效果的ScrollView嵌套GridView

    以前写过一篇带阻尼回弹效果的ScrollView,但是有些小问题,于是又重新整理了一下,这篇文章一是一个带阻尼的Scrollview,再个就是Scrollview嵌套GridView实现,而GridV ...

  10. Android设置item的行间距,以及去掉分割线方法

    1.设置item的行间距: 可以在xml布局文件中的listView下设置xml属性: android:divider="#00000000" android:dividerHei ...