C++-LeetCode刷题心得-数组部分-1

题目一:从一个数组中去除指定Vaule,并返回新的数组长度
解题思路:
使用2个游标i,j,来遍历数组,如果碰到了value,使用j记录位置,同时递增i,直到下一个非value出现,将此时i对应的值复制到j的位置上,增加j,重复上述过程直到遍历结束。这时j就是新的数组长度。
代码如下:
class Solution {
public:
int removeElement(vector& nums, int val) {
int i=0,j=0;
for(i=0;i<nums.size();i++)
{
if(nums[i]==val)
{
continue;
}
nums[j]=nums[i];
j++;
}
return j;
}
};
总结学习到的知识点:
1.了解了C++中向量的部分操作,比如得到向量的大小可以使用 num.size()来得到
2.知道了一个重要算法就是双指针,使用2个游标可以很好来达到额外空间复杂度为O(1)的要求。这在接下来的去除数组中的重复数字有一定作用。
3.最后输出的结果是数组的原因是因为输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的,所以最后输出的结果为数组而不是数字。
题目二:删除排序数组中的重复项
解题思路:
对于一个排好序的数组来说,A[N+1]>=A[N],我们仍然使用两个游标i和j来处理,假设i=j+1,如果A[i]==A[j],那么我们递增i,直到A[i]!=A[j],这时候我们再设置A[j+1]=A[i],同时递增i和j,重复上述过程直到遍历结束。
代码如下:
class Solution {
public:
int removeDuplicates(vector& nums) {
if(nums.size() == 0)
return 0;
int j=0;
for(int i=1;i<nums.size();i++)
{
if(nums[j]!=nums[i])
nums[++j]=nums[i];
}
return j+1;
}
};
总结学习到的知识点:
1.再次操作双指针的用法,假如一开始不熟悉可以现在纸上用笔操作一下看看效果,就能写出代码。
2.利用替换思想,其实这题跟上面那题大同小异,差别就是一个是固定的VALUE一个是会变化的重复的值,只要想到这一层,代码也变得好写了

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页