【力扣】-- 移除元素
链接
题目要求
示例
输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解法
①使用for循环遍历整个数组
int removeElement(int* nums, int numsSize, int val) { int size = 0; for(int i = 0; i < numsSize - 1; i++) { if(nums[i] != val) { nums[size] = nums[i]; size++; /*也可以写成 nums[size++] = nums[i]*/ } } return size; }
② 双指针法(定义两个变量)
int removeElement(int* nums, int numsSize, int val) { int src = 0, dst = 0; while(src < numsSize) { if(nums[src] != val) { nums[dst++] = nums[src++]; } else { src++; } } return dst; }
【力扣】-- 合并两个有序数组
链接
题目要求
示例
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3
输出:[1,2,2,3,5,6]
解释:需要合并 [1,2,3] 和 [2,5,6] 。
合并结果是 [1,2,2,3,5,6] ,其中斜体加粗标注的为 nums1 中的元素。
解法
①先合并后统一排序
int cmp(int* p1,int* p2) { return *p1 - *p2; } 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); }
②从后往前比大小
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--]; } else { nums1[l3--] = nums2[l2--]; } } //最后要么l1<0,要么l2<0 while(l2 >= 0) { nums1[l3--] = nums2[l2--]; } }