• 每日一练——快速合并2个有序数组


    每日一练来喽~~~

    今天up主为大家分享一个,快速合并2个有序数组的法子,注意听哟!

     题目:

    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。

    请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

    注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 

    在这里我们就打消再建一个数组进行排序的想法吧。

     思路:

    1)2个数组的元素逐一进行比较

    2)接下来就考虑是比较元素的大还是比较元素的小?

    3)从前往后比较还是从后往前比较?

    解题方法
    需要比较元素谁大
    需要从后往前进行遍历,避免数据的覆盖 定义3个下标变量 l1,l2,l3 来判断元素大小

        int l1 = m-1;

        int l2 = n-1;

        int l3 = m+n-1;

     对应草图如下:

    对于采用OJ的答题方式对应完整代码如下 

    1. void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
    2. //双指针的一个应用
    3. int l1 = m-1;
    4. int l2 = n-1;
    5. int l3 = m+n-1;
    6. while(l1 >= 0 && l2 >= 0)
    7. {
    8. //比较哪一个元素大
    9. if(nums1[l1] > nums2[l2])
    10. {
    11. // nums1[l3] = nums1[l1];
    12. // l1--,l3--;可以合并为一句
    13. nums1[l3--] = nums1[l1--];
    14. }
    15. else
    16. {
    17. nums1[l3--] = nums2[l2--];
    18. }
    19. }
    20. //来到这里说明有一个数组已经遍历完了
    21. // 注意当我的数组 nums2遍历完的时候,这时数组就已经完成题目要求了
    22. while( l2 >= 0)//数组nums1 已经遍历完了,这时只需把数组2直接逐个给合并的新数组即可
    23. {
    24. nums1[l3--] = nums2[l2--];
    25. }
    26. }

    好了,以上就是我要为大家share的今日一练,要是觉得还不错的话,欢迎各位大佬们给俺点个赞,来个关注呗,小生有礼了!

  • 相关阅读:
    qiankun - 微前端应用搭建
    升级PIP
    C++学习 --vector
    Leetcode刷题详解——点名
    鸿蒙系统调研适配
    酒水销售系统
    智慧物流数字孪生怎么样?元宇宙医疗供应商首选广州华锐互动
    软件测试为什么外包更好?权威软件测试外包公司应该具备的资质
    【面试题】JS第七种数据类型Symbol详解
    满足多元需求:捷码打造3大一站式开发套餐,助力高效开发
  • 原文地址:https://blog.csdn.net/X_do_myself/article/details/134042356