zoukankan      html  css  js  c++  java
  • 领扣(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 }
  • 相关阅读:
    20165225《Java程序设计》第六周学习总结
    实验一 Java开发环境的熟悉
    20165225《Java程序设计》第五周学习总结
    移动web——bootstrap响应式工具
    移动web——bootstrap栅格系统
    移动web——bootstrap模板
    移动web——媒体查询
    移动web——轮播图
    移动web——touch事件应用
    移动web——touch事件介绍
  • 原文地址:https://www.cnblogs.com/axiangcoding/p/10034469.html
Copyright © 2011-2022 走看看