LeetCode第[88]题(Java):Merge Sorted Array(合并已排序数组)
题目:合并已排序数组
难度:Easy
题目内容:
Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array.
翻译:
给定两个排序的整数数组nums1和nums2,将nums2合并到nums1中作为一个排序数组。
注意:
nums1和nums2中初始化的元素数量分别为m和n。
nums1有足够的空间(大小大于或等于m+n)来容纳nums2中的额外元素。
我的思路:此处和归并排序中的小段归并有点像,不一样的地方在于在于其中nums1数组的长度是合并之后的长度。
这样一来用传统的归并排序中的合并就不行了,因为在合并过程中可能将nums1数组中的数覆盖掉(eg.【4,5,0,0】【1,2】)
除非再新建一个临时数组,将二者合并一起放入此数组中,然后再将此数组的值全部复制到nums1,那这样nums1的长度就没什么意义了。
所以可以考虑归并排序的第二种方法———插入排序。原理不再赘述。把nums2直接当作接在nums1后面的数即可。
三个指针:i 表示此时nums2的位置(从0开始);j表示此时nums1的位置(从m-1开始);k表示内部循环中nums1的位置。
我的代码:
     public void merge(int[] nums1, int m, int[] nums2, int n) {
         int j = m - 1;
         for (int i = 0; i < n; i++) {
             if (j == -1 || nums2[i] >= nums1[j] ) {
                 while (i < n) {
                     nums1[++j] = nums2[i++];
                 }
                 return;
             } else {
                 int k = j;
                 for (; k > -1 && nums1[k] > nums2[i]; k--) {
                     nums1[k+1] = nums1[k];
                 }
                 nums1[k+1] = nums2[i];
                 j++;
             }
         }
     }
我的复杂度:O(N*M) 空间复杂度 O(1)
编码过程中的问题:
1、第4行,当m==0的时候,nums1内也是有一个0的,此时如果不加以判断,就会把0当作元素直接进入归并排序中去,然后就会越界,所以加入 j == -1 || 。
eg.【0】m=0【1】n=1。
2、第15行,忘记了此时放入了一个,nums1的指针需要向右移动一个 —— j++
答案代码:
 public void merge(int A[], int m, int B[], int n) {
     int i = m-1, j = n-1, k = m+n-1;
     while (i>-1 && j>-1)
         A[k--] = A[i] > B[j]  ? A[i--] : B[j--];
     while (j>-1)
         A[k--] = B[j--];
 }
答案思路:
既然从前往后会覆盖到,但是后面全是0,那么从后往前就不会覆盖到了。
(就算极端情况,A内全部小于B,后面的0刚好够B放,不会出现覆盖情况)
1、当 i 且 j 都没消耗完时,从后往前,谁大谁就入,并且相应指针消耗1;
2、如果 j 还没消耗完,则将B内剩下的都放入A;(此时如果A没消耗完也不需要管了,因为本来就已经在A里面按顺序排好了)
LeetCode第[88]题(Java):Merge Sorted Array(合并已排序数组)的更多相关文章
- LeetCode  Merge Sorted Array 合并已排序的数组
		void merge(int A[], int m, int B[], int n) { int *a=A,*b=B; ,j=; ||m==){ //针对特殊情况,比如A或B中无元素的情况 & ... 
- leetcode 题解:Remove Duplicates from Sorted Array(已排序数组去重)
		题目: Given a sorted array, remove the duplicates in place such that each element appear only once and ... 
- 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 ... 
- LeetCode OJ: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 153. Find Minimum in Rotated Sorted Array寻找旋转排序数组中的最小值 (C++)
		题目: Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ( ... 
- LeetCode(力扣)——Search in Rotated Sorted Array 搜索旋转排序数组  python实现
		题目描述: python实现 Search in Rotated Sorted Array 搜索旋转排序数组 中文:假设按照升序排序的数组在预先未知的某个点上进行了旋转. ( 例如,数组 [0,1 ... 
- [LeetCode] 88. Merge Sorted Array 混合插入有序数组
		Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ... 
- [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] 88. Merge Sorted Array 合并有序数组
		Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note: T ... 
随机推荐
- 前端 javascript 数据类型 数组 列表
			javascript数组相当于python的列表 创建列表 a = [1,2,3,4]; [1, 2, 3, 4] 获取列表长度 a = [1,2,3,4]; [1, 2, 3, 4] a.lengt ... 
- JAVA与ACM
			这两天学了一下JAVA的语法,还没有学习后面的核心地方,突然间觉得JAVA这门语言很棒,我要在接下来的时间系统的学习一下.就这么愉快地决定了. Java对于大数计算这方面的优势很大.最重要的是代码量小 ... 
- [Python] logging.logger
			<1>. mylogger = logging.getLogger("abc") logging.debug()/logging.info()/logging.warn ... 
- 转: MYSQL获取更新行的主键ID
			在某些情况下我们需要向数据表中更新一条记录的状态,然后再把它取出来,但这时如果你在更新前并没有一个确认惟一记录的主键就没有办法知道哪条记录被更新了. 举例说明下: 有一个发放新手卡的程序,设计数据库时 ... 
- Selenium的PageFactory & PageObject 在大型项目中的应用
			因为最近遇到的技术问题一直没找到可行的解决办法,一直在翻看selenium的源代码,之前写测试代码的时候就是拿来即用,写什么功能啊,就按手动的操作步骤去转换,近日看到一个文章,又去wiki上查了查,觉 ... 
- 工作笔记——js前端规范
			去年年末做了一个项目,因为第一次做前端管理职位,第一次做整个项目的前端架构很多东西都不熟悉,作为一次大胆的尝试. js方面的只有一个坑,那就是前端与后端的网络层封装,这一块是在后端的协助下开发的.网络 ... 
- mysql数据库从删库到跑路之mysql其他
			一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便测试,可以使用IDE工具 下载链接:https://pan.baidu.com/s/1bpo5mqj 掌握: #1. 测试+链接数据 ... 
- JVM内存分配原理
			堆栈常量池等内存分配原理详解 存储的方式: 寄存器 栈(stack) 堆(heap) 静态域 常量池 非RAM存储 JAVA寄存器 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. ... 
- 4. Median of Two Sorted Arrays(2个有序数组的中位数)
			There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ... 
- 裁剪TOGAF进行产品架构开发
			http://ea.zhoujingen.cn/56.html . 有人和我说“周老师,我的企业条件不适合,学习企业架构没用.” 如果等公司让我用企业架构,估计会比我自己开始晚七八年.我们学习任何内容 ... 
