解题方法:
以空间换时间:可以开辟一个额外空间tmp。用双指针进行遍历解决问题
不让开辟额外空间:将自己作为想象成两个空间。用快慢指针进行遍历
一、真题演练
leecode——27题(移除元素)
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
int removeElement(int* nums, int numsSize, int val){
//构建快慢指针
int src = 0;//快
int dst = 0;//慢
while(src<numsSize)
{
if(nums[src]!=val)//当值不是val时
{
nums[dst]=nums[src];//两个指针一起向前走
++src;
++dst;
}
else//如果值是val
{
++src;//让快指针先走
}
}
return dst;
}
leecode——26(删除有序数组中的重复项)
给你一个升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
int removeDuplicates(int* nums, int numsSize) {
int src = 0;//快
int dst = 0;//慢
while (src < numsSize)
{
if (nums[src] == nums[dst])//注意此处是两个等号
{
++src;//如果两个相等,就让src先走,中间的就是重复项,留着后期删除
}
else
{
++dst;//先让dst走一步,保留一个值
nums[dst] = nums[src];
++src;
}
}
return dst + 1;//返回的是长度,所以要+1
}