27. 移除元素
解题思路
数组里面的元素都是大于0的,那么我们的思路就是,遍历整个数组。查找到为删除的值和元素的相等时,后面的不为相等的进行覆盖。
时间复杂度O(n),空间复杂度O(1)
代码
int removeElement(int* nums, int numsSize, int val){ int i=0,j=0; for(i=0;i<numsSize;i++) { if(nums[i]==val) { continue; } nums[j++]=nums[i]; } return j; }
88. 合并两个有序数组
解题思路
思路1:
再次开辟一个空间为m+n的数组,将nums1数组的里面的元素分别与nums2里面的元素比较,直达其中一个数组里面的元素全部拷贝到新开辟的数组中,然后把另一个数组剩下的元素拷贝到新的数组中。最后把新开辟数组拷贝到nums1中。
时间复杂度O(m+n),空间复杂度O(m+n)
思路2:
比较两个数组最大的元素,也就是从后往前遍历,较大的插入到nums1后面,直到其中一个数组遍历完成。
时间复杂度O(m+n),空间复杂度O(1)
代码
思路1代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){ int* num=(int*)malloc(nums1Size*sizeof(int)); if(num==NULL) return; int i=0,j=0,x=0; for(i=0;i<m;i++) { for(;j<n;j++) { if(nums1[i]>nums2[j]) { num[x++]=nums2[j]; } else { num[x++]=nums1[i]; break; } } if(j==n) num[x++]=nums1[i]; } if(i==m) while(j<n) { num[x++]=nums2[j++]; } for(i=0;i<nums1Size;i++) { nums1[i]=num[i]; } free(num); num=NULL; }
思路2代码
注意边界
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){ int a,b,c; a=m-1; b=n-1; c=nums1Size-1; while(a!=-1&&b!=-1) { if(nums1[a]>nums2[b]) { nums1[c--]=nums1[a--]; } else { nums1[c--]=nums2[b--]; } } if(a==-1) while(b!=-1) { nums1[c--]=nums2[b--]; } }