目录
1.LeetCode第27题 —— 移除元素
题目要求如下:
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用
O(1)
额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
链接如下:
题目思路:
- 首先定义两个两个整数 src 和 dest 都指向数组的第一个元素(下标为0);
- 如果nums[dest] != value,并且让nums[src] = nums[dest],让src++,dest++,如果nums[dest] == value,就继续让dest++;
- 那么循环终止的条件是什么呢?很明显就是 dest < numsSize。
题目图解如下:
代码和结果如下:
int removeElement(int* nums, int numsSize, int val){ int src = 0; int dest = 0; while (dest < numsSize) { if (nums[dest] != val) { nums[src++] = nums[dest++]; } else { dest++; } } return src; }
2.LeetCode第26题 —— 删除有序数组中的重复项
题目要求如下:
给你一个 非严格递增排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。考虑
nums
的唯一元素的数量为k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。- 返回
k
。链接如下:
题目思路:
- 首先此数组是非严格递增的,还是让一个dest和src分别指向下表为 0 和 下标为 1 的两个元素;
- 如果两个元素的值相等,就让src++,如果不相等,就先让dest++,然后让nums[dest] = nums[src],再让src++;
- 很明显,当src = numsSize-1 的时候循环停止,即src < numsSize。
题目图解:
代码和结果如下:
int removeDuplicates(int* nums, int numsSize){ int src = 1; int dest = 0; while (src < numsSize) { if (nums[dest] != nums[src]) { nums[++dest] = nums[src++]; } else { src++; } } return dest + 1; }
3. LeetCode第88题——合并两个有序数组
题目要求如下:
给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并
nums2
到nums1
中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组
nums1
中。为了应对这种情况,nums1
的初始长度为m + n
,其中前m
个元素表示应合并的元素,后n
个元素为0
,应忽略。nums2
的长度为n
。题目链接:
题目思路如下:
- 首先定义一个数组来存放排序后的数组;
- 其次定义两个整形分别代表第一个数组的首元素和第二个数组的首元素;
- 然后让这两个元素比较大小,把小的元素放在新数组里,并让对应的指向自加1;
- 当其中一个指向指到了对应数组的最后一个元素就让另一个数组直接插入新定义的数组。
题目图解如下:
代码和运行结果如下:
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){ int dest = 0; int src = 0; int i = 0; int tmp[400] = {0}; while (dest < m && src < n) { if (nums1[dest] <= nums2[src]) { tmp[i++] = nums1[dest++]; } else { tmp[i++] = nums2[src++]; } } if (dest == m) { int j = src; for (j = src;j < n;j++) { tmp[i] = nums2[j]; i++; } } else { int j = 0; for (j = dest;j < m;j++) { tmp[i++] = nums1[j]; } } int k = 0; for(k = 0;k < i;k++) { nums1[k] = tmp[k]; } }
感谢关注,欢迎指正