[leetcode] 27. remove element
c++11 支持auto自动变量: 已知nums是vector类型
用auto it = nums.begin()
代替
vector<int>::iterator it = nums.begin();
这样可以减少代码量。
题目为:
简单说就是在一个vector中将与给定的数val不同的数的个数n返回,同时此时的vector的前面的n个数是不同的数(顺序不必和原来的相同),新的vector的后面有没有,是什么都不重要,
本题可以用双指针的方法解决:
1.第一种双指针方法:
很直接了当,就是用了两个指针标记,当遇到相同的就用 j 记录下来,i 则一直往前走,直到末尾,这样,j 使得前 n 个数是不同的了,这个方法看似很合理,但是实际很慢,当遇到 [ 1,2,3,4,5] 而 i 为 5 时,i 和 j 都要走完5次,所以时间复杂度为O(2n) ,显然比较浪费 。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int j = 0;
for(int i = 0; i < nums.size(); i++)
{
if(val != nums[i])
nums[j++] = nums[i];
}
return j;
}
};
2.考虑用双指针聚拢的方法:
这种方法应该是最优的解法,将时间复杂度定在了O(n),思想就是向中心靠拢,当遇到相同的就把最后一个元素拉来比较,直到不同时才继续前进,充分利用了不考虑顺序,不考虑后面元素的规则。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i = 0;
int j = nums.size();
while(i < j)
{
if(nums[i] == val)
{
nums[i] = nums[--j];
}
else
{
i++;
}
}
return j;
}
};