(本文非商用,仅作为个人学习笔记参考)
题目来源:
27. 移除元素 - 力扣(LeetCode)
题解笔记:
1、力扣官方题解(Java)
(收获博客模板:思路-算法-复杂度分析)
法一:双指针
保留两个指针i和j,其中i是慢指针,j是快指针。
if(nums[j]!=val)
{
nums[i]=nums[j];
i++;
}
法二:双指针(优于法一)
当nums[i]==val时对nums[i]进行移除,而不用像法一一样移动全部元素,只对局部进行操作。
(如果要移除的元素很少效率更高)
if(nums[i]==val)
{
nums[i]=nums[n - 1];
n--;
}
int removeElement(vector<int>& nums,int val) {
auto it=remove(nums.begin(),nums.end(),val);
return it-nums.begin();
}
if(nums[i]==val)
{
nums.erase(nums.begin()+i);
i--;
}
4、明昊昊 双指针 (C++)
目前看到的最中规中矩的写法,搬运大佬的完整代码。
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int i = 0; // 快指针
int j = 0; // 慢指针
while(nums.size() > 0) {
// 若该元素值不等于val
if(nums[i] != val) {
if(i == nums.size()-1) { // 若该元素为数组的末尾元素
nums[j] = nums[i];
return j+1;
}
nums[j] = nums[i];
i++;
j++;
// 若该元素值等于val
} else {
if(i == nums.size()-1) {
return j;
}
i++;
}
}
return 0;
}
};