美文网首页LeetCode每日一题
LeetCode每日一题:合并两个有序数组

LeetCode每日一题:合并两个有序数组

作者: Patarw | 来源:发表于2020-08-07 14:24 被阅读0次

第一种解法,我第一眼看到这个就想到了插入排序法,因为nums1是有序的,所以只需要考虑nums2的插入即可,相当于已经帮你排好了m个数,从第m+1个数开始插入

  • 代码实现;
 class Solution {
public void merge(int[] nums1, int m, int[] nums2, int n) {

   int mIndex = m;       
   int a = m;
 for(int i = 0;i < n ;i++){    
    mIndex = a;    
   while(mIndex > 0){
      if(nums1[mIndex - 1] > nums2[i]){
          nums1[mIndex] = nums1[mIndex - 1];
          mIndex--;
      }else{
          break;
      }
   }
   nums1[mIndex] = nums2[i];
   a++;
 }
}
}

但是仔细想想的话发现我并没有用到nums2这个数组也是有序的条件,所以第一种方法还是不行的,必须把所有能用到的条件都用起来,于是有了第二种解法,第二种解法的思路是,用nums2数组的数与nums1里面的最后一个数(及最大的那一个数)比较,如果比它大就直接放到nums1的最后(m+n-1),如果比它小就后移一位

  • 第二种解法代码实现:
class Solution {
 public void merge(int[] nums1, int m, int[] nums2, int n) {
    // 三指针 指针一p1、nums1有效元素尾部;指针二p2、nums2尾部;指针三p3、最终数组尾部
    // 1.当,p1>=0时,nums[p1],nums[p2]对比
    // 1.1 nums[p1]大,将nums[p1]放入p3位置。p1--,p3--
    // 1.2 nums[p2]大于等于nums[p1],将nums[p2]放入p3位置。p2--,p3--
    // 2.当,p1<0时,将nums[p2]放入p3位置。p2--,p3--
    // 循环结束条件:p2<0
    
    int p1=m-1,p2=n-1,p3=m+n-1;
    while(p2 >= 0){
        if(p1 >= 0 && nums1[p1] > nums2[p2]){
            nums1[p3--] = nums1[p1--];
        } else {
            nums1[p3--] = nums2[p2--];
        }
    }
}
}

代码一下就简单了许多,所以一定要把所有能用上的条件都用上,才能达到最好的代码

相关文章

网友评论

    本文标题:LeetCode每日一题:合并两个有序数组

    本文链接:https://www.haomeiwen.com/subject/hgrfdktx.html