每日一练来喽~~~
今天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的答题方式对应完整代码如下
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){//双指针的一个应用int l1 = m-1;int l2 = n-1;int l3 = m+n-1;while(l1 >= 0 && l2 >= 0){//比较哪一个元素大if(nums1[l1] > nums2[l2]){// nums1[l3] = nums1[l1]; // l1--,l3--;可以合并为一句nums1[l3--] = nums1[l1--];}else{nums1[l3--] = nums2[l2--];}}//来到这里说明有一个数组已经遍历完了// 注意当我的数组 nums2遍历完的时候,这时数组就已经完成题目要求了while( l2 >= 0)//数组nums1 已经遍历完了,这时只需把数组2直接逐个给合并的新数组即可{nums1[l3--] = nums2[l2--];}
}
好了,以上就是我要为大家share的今日一练,要是觉得还不错的话,欢迎各位大佬们给俺点个赞,来个关注呗,小生有礼了!