领扣(LeetCode)合并两个有序数组 个人题解

Posted Axiangcoding

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了领扣(LeetCode)合并两个有序数组 个人题解相关的知识,希望对你有一定的参考价值。

给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 使得 num1 成为一个有序数组。

说明:

  • 初始化 nums1 和 nums2 的元素数量分别为 m 和 n
  • 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。

示例:

输入:
nums1 = [1,2,3,0,0,0], m = 3
nums2 = [2,5,6],       n = 3

输出: [1,2,2,3,5,6]


这道题,第一想法是动态插入,但是种种错误导致了失败,特别是没有考虑到当nums1遍历完了后,nums2剩下的元素怎么处理。循环不太好写。

参考了代码,发现了还是空间换复杂度的做法。新建立一个数组存放两个数组的当前最小值,存放完了索引加1,继续寻找两个数组中的最小值。这样做下去,直到nums1遍历完或者nums2遍历完。

这时候,假设nums1没遍历完,那么nums2肯定遍历完了,就把nums1的值塞到尾部。如果nums2没遍历完,那么nums1肯定遍历完了,把nums2塞到尾部。这里可以根据当前位置的索引来判断。

参考的链接(他的题解不够详细):https://blog.csdn.net/qq_38595487/article/details/79935382

代码如下:

 1 class Solution {
 2     public void merge(int[] nums1, int m, int[] nums2, int n) {
 3         int[] newnums=new int[m+n];
 4         int index=0;
 5         int i=0,j=0;
 6         while(i<m && j<n)
 7         {
 8             if(nums1[i]<nums2[j])
 9                 newnums[index++]=nums1[i++];
10             else
11                 newnums[index++]=nums2[j++];
12         }
13         while(i<m)
14             newnums[index++]=nums1[i++];
15         while(j<n)
16             newnums[index++]=nums2[j++];
17         System.arraycopy(newnums,0,nums1,0,newnums.length);
18 
19     }
20 }

 

以上是关于领扣(LeetCode)合并两个有序数组 个人题解的主要内容,如果未能解决你的问题,请参考以下文章

领扣(LeetCode)第三大的数 个人题解

领扣(LeetCode)移动零 个人题解

领扣(LeetCode)寻找旋转排序数组中的最小值 个人题解

领扣(LeetCode)两个列表的最小索引总和 个人题解

领扣(LeetCode)最大连续1的个数 个人题解

领扣(LeetCode)错误的集合 个人题解