目录
27.移除元素
题目
思路
代码
26. 删除有序数组中的重复项
题目
思路
代码
88.合并两个有序数组
题目
思路
代码
总结
27.移除元素
27. 移除元素 - 力扣(LeetCode)https://leetcode.cn/problems/remove-element/description/
题目
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用
O(1)
额外空间并 原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:
示例 1:
输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
思路
双指针src和dst,src上元素和val比较,当每次src上的元素和val相等时,src加加一次,dst不动,不相等时将src上的元素覆盖dst上的元素。
图解👇
代码
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;
}
26. 删除有序数组中的重复项
26. 删除有序数组中的重复项 - 力扣(LeetCode)https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/
题目
给你一个 非严格递增排列 的数组
nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums
中唯一元素的个数。
示例:
示例 1:
输入:nums = [1,1,2] 输出:2, nums = [1,2,_] 解释:函数应该返回新的长度 2,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
思路
双指针i和size,依次比较,不相等时依次加加,相等时i加加再比较,直到不再相等时将i上值赋到size上,最后返回size+1为所得新数组元素个数。
图解👇
代码
int removeDuplicates(int* nums, int numsSize){
int size = 0;
for(int i = 1; i < numsSize; i++)
{
if(nums[size] != nums[i])
{
nums[++size] = nums[i];
}
}
return size+1;
}
88.合并两个有序数组
88. 合并两个有序数组 - 力扣(LeetCode)https://leetcode.cn/problems/merge-sorted-array/description/
题目
给你两个按 非递减顺序 排列的整数数组
nums1
和nums2
,另有两个整数m
和n
,分别表示nums1
和nums2
中的元素数目。请你 合并
nums2
到nums1
中,使合并后的数组同样按 非递减顺序 排列。
示例:
示例 1:
输入: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 中的元素。示例 2:
输入:nums1 = [1], m = 1, nums2 = [], n = 0 输出:[1] 解释:需要合并 [1] 和 [] 。 合并结果是 [1] 。
思路
三指针end1、end2、end,从end2和end1开始往前进行比较,并取大插入到end上。
注意:
- end2先小于0的情况不需要考虑,因为此时合并已经完成了
- end1先小于0的情况需要考虑,此时只需要将end2赋给end,并同时减减即可。
代码
void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){
int end1=m-1,end2=n-1,end=m+n-1;
while(end1>=0&&end2>=0)
{
if(nums1[end1]>nums2[end2])
{
nums1[end--]=nums1[end1--];
}
else
{
nums1[end--]=nums2[end2--];
}
}
while(end2>=0)
{
nums1[end--]=nums2[end2--];
}
}
总结
上面3道题均考察了数组中指针的运用,在遇到类似问题我们可以考虑利用双指针或三指针的思路来解决。