合并两个有序数组
描述:
错误代码
c语言代码⬇️
太多了放不下
错误原因:
正确代码
c语言代码⬇️
思路:将nums1中的前m个元素移动到后面,指针i指向m个元素的开头
指针j指向nums2开头,同时遍历并比较,小者入nums1(下标从k=0开始)
//思路2:将m个元素移到最后,同时遍历nums1和nums2
void swap(int* a, int* b){
int t = *a;
*a = *b;
*b = t;
}
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
if(m == 0){
for(int i = 0; i < n; i++){
nums1[i] = nums2[i];
}
return ;
}
for(int i = 1; i <= m; i++){
swap(&nums1[nums1Size-i], &nums1[m-i]);
}
int i = nums1Size - m;
int j = 0;
int k = 0;
while(i < nums1Size && j < n){
if(nums1[i] < nums2[j]){
nums1[k++] = nums1[i++];
}else{
nums1[k++] = nums2[j++];
}
}
while(j < n){
nums1[k++] = nums2[j++];
}
}
思维混乱,边界把握不定,代码模糊臃肿,不妙。
还是原来的思路,代码相对思路明确一点⬇️
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
for(int i = 1; i <= m; i++){
int t = nums1[nums1Size-i];
nums1[nums1Size-i] = nums1[m-i];
nums1[m-i] = t;
}
int i = nums1Size - m;
int j = 0;
int k = 0;
while(i < nums1Size && j < nums2Size){
if(nums1[i] < nums2[j]){
nums1[k] = nums1[i];
i++;
}else{
nums1[k] = nums2[j];
j++;
}
k++;
}
while(j < nums2Size){
nums1[k++] = nums2[j++];
}
}
以下代码更妙⬇️
//不要僵化思维,数组按非递减排列,反过来看这个数组也是非递增的,可以将指针指向nums1的n+m-1处,从后往前进行归并排序
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int k = n+m-1;
int i = m-1;
int j = n-1;
while(i >= 0 && j >= 0){
if(nums1[i] > nums2[j]){
nums1[k] = nums1[i];
i--;
}else{
nums1[k] = nums2[j];
j--;
}
k--;
}
while(j >= 0){
nums1[k--] = nums2[j--];
}
}
总结
总结:🤔