LeetCode刷题 第一天-- 88. 合并两个有序数组

前置知识点:

const:该变量的值不能被修改

qsort 是 C 语言标准库 <stdlib.h> 中的快速排序(QuickSort)函数,用于对数组进行排序

void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));
  • base:指向要排序的数组的指针。

  • num:数组中的元素个数。

  • size:每个元素的大小(以字节为单位)。

  • compar:比较函数,用于定义排序规则。该函数需要返回

    1. 负值:若 a 应排在 b 之前;

    2. 正值:若 a 应排在 b 之后;

    3. 0:若 ab 相等。

 

i++和++i的区别:  

 

   i++ 后置自增:先放回i 的值,再执行i=i+1;需要用到i的原始值;

  ++I:前置自增 先执行i=i+1,再放回新值

p1 < m || p2 < n 只要 任意一个条件为 true,整体结果就是 true

 

题目:

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

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

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

 

我的方法:

 思路:想结合在一个函数中nums1中,然后使用冒泡法来判断

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    for (int i = 0; i != n; ++i) {
        nums1[m + i] = nums2[i];
    }
    for(int t = 0;t<nums1Size - 1;t++)
    {
        if(nums1[t]> nums1[t+1])
        {
            int temp = nums1[t+1];
            nums1[t+1] = nums1[t];
            nums1[t] = temp; 
        } 
     }
}
 

参考答案分析:

方法1:

前置知识点:

const:该变量的值不能被修改

qsort 是 C 语言标准库 <stdlib.h> 中的快速排序(QuickSort)函数,用于对数组进行排序

void qsort(void *base, size_t num, size_t size, int (*compar)(const void *, const void *));
  • base:指向要排序的数组的指针。

  • num:数组中的元素个数。

  • size:每个元素的大小(以字节为单位)。

  • compar:比较函数,用于定义排序规则。该函数需要返回

  1. 负值:若 a 应排在 b 之前;

  2. 正值:若 a 应排在 b 之后;

  3. 0:若 ab 相等。

int cmp(const void *a, const void *b) {
    return *(const int*)a - *(const int*)b;  // 升序排序
}

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    for (int i = 0; i != n; ++i) {
        nums1[m + i] = nums2[i];
    }
    qsort(nums1, nums1Size, sizeof(int), cmp);// nums1指针,默认首地址,定义的参数都是int整数型,cmp就是个比较函数
}

 本质与冒泡法差不多,只是C库函数中提供一个峰值好的函数

 

方法二:双指针方法

前置知识:

i++和++i的区别:  

   i++ 后置自增:先放回i 的值,再执行i=i+1;需要用到i的原始值;

  ++I:前置自增 先执行i=i+1,再放回新值

  p1 < m || p2 < n 只要 任意一个条件为 true,整体结果就是 true

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
     int p1 = 0 ,p2= 0;    
     int sorted[n+m];//新数组,用来存储排序好的值
     int cur;//临时存储数据
     
     while(p1<m||p2<n){    //只有当 p1 >= m 且 p2 >= n 时,结果才是 false
        if(p1 == m){//表示nums1所有数据都比较完了,那么nums2此时对应的值肯定是大的
            cur = nums2[p2++];
        }else if(p2==n)
            cur = nums1[p1++];
        }else if (nums1[p1]<nums2[p2]){  //nums1中P1的值小于muns2中P2的值  
            cur = nums1[p1++];//把小的值先存进进去
        }else{//nums1的值大于muns2中P2的值
            cur = nums2[p2++];//把小的存进去
        }
        sorted[p1+p2-1]=cur;
     }
     for(int i =0;i!=n+m;++i)
     {
        nums1[i]=sorted[i];
     }
}

方法三:逆向双指针---我觉方法3和方法2没有区别,改用的变量都是一样需要。所需要的时间维度都是一样的。

因为muns1数组的大小是知道的,以及目前有多个位也是知道的。

从大往小的比。直接从两个数组的最大值开始比,比大的直接放在nums1最后面

void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) {
    int p1 = m - 1, p2 = n - 1;
    int tail = m + n - 1;
    int cur;
    while (p1 >= 0 || p2 >= 0) {
        if (p1 == -1) {
            cur = nums2[p2--];
        } else if (p2 == -1) {
            cur = nums1[p1--];
        } else if (nums1[p1] > nums2[p2]) {
            cur = nums1[p1--];
        } else {
            cur = nums2[p2--];
        }
        nums1[tail--] = cur;
    }
}

 

posted on 2025-04-02 22:08  Aliang2020  阅读(226)  评论(0)    收藏  举报