自己的主要思想是双指针,一个在数组首,一个在数组尾,通过指针移动进行元素交换,首指针只要所指元素为val,就进行换位,将val值全部换到数组尾。设置一个count,交换一次加一次。
1、首指针、尾指针都为val(count++)、首指针非val,尾指针非val,则front++,rare--。
2、首指针为val,尾指针非val,交换,front++;
3、首指针非val,尾指针为val(count++),rare--。
下面为代码(写的比较乱):
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
if(!nums.empty())//注意vector判空
{
int length = nums.size();
int front = 0;
int rare = length-1;
int count = 0;
for(int i=0;i<=length-1;i++)//可以直接小于length
{
if(front<=rare)
{
if(nums[front]==val&&nums[rare]!=val)
{
int temp = 0;
temp=nums[rare];
nums[rare]=nums[front];
nums[front]=temp;
front++;
rare--;
count++;
}
else if(nums[rare]==val&&nums[front]!=val)
{
front++;
rare--;
count++;
}
else if(nums[rare]!=val&&nums[front]!=val)
{
front++;
}
else
{
rare--;
count++;
}
}
else
{
break;
}
}
// int newLength = 0;
// while(nums[newLength]!=val)//如果vector中没有val,就会一直循环下去,造成访问越界
// {
// newLength++;
// }
return length-count;
}
else
{
return 0;
}
}
};
看了下官方解答,感觉自己没有好好读题,只取前面非val的数组;
通过首尾指针(尾指针设置循环)从左到右的方法,尾指针非val,则front++,把尾指针的值赋给首指针。
核心思想是首指针指向要处理的元素,尾指针将非val交换到首指针,挺神奇的。
代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int left = 0;
for (int right = 0; right < n; right++) {
if (nums[right] != val) {
nums[left] = nums[right];
left++;
}
}
return left;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/remove-element/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。