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:比较函数,用于定义排序规则。该函数需要返回
-
负值:若
a应排在b之前; -
正值:若
a应排在b之后; -
0:若
a和b相等。
-
i++和++i的区别:
i++ 后置自增:先放回i 的值,再执行i=i+1;需要用到i的原始值;
++I:前置自增 先执行i=i+1,再放回新值
p1 < m || p2 < n 只要 任意一个条件为 true,整体结果就是 true。
题目:
给你两个按 非递减顺序 排列的整数数组 nums1和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。
请你 合并 nums2到 nums1 中,使合并后的数组同样按 非递减顺序 排列。
注意:最终,合并后数组不应由函数返回,而是存储在数组 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:比较函数,用于定义排序规则。该函数需要返回
-
负值:若
a应排在b之前; -
正值:若
a应排在b之后; -
0:若
a和b相等。
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; } }
浙公网安备 33010602011771号