我的解法:
class Solution {
public int removeElement(int[] nums, int val) {
int deleteNums=0;//记录非选中值要向前移动的次数
for(int i =0;i<nums.length;i++)
{
if(nums[i]==val)
{
deleteNums++;
}
else
{
nums[i-deleteNums] = nums[i];//非选中值向前移动deleteNums次
}
}
return (nums.length-deleteNums);
}
}
标答:
使用双指针,“慢指针”和“快指针”。
public int removeElement(int[] nums, int val) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
}
return i;
}
注意到元素顺序可以改变
优化算法:当每次遇到要删除的值时,将它放到数组的末尾,然后把数组的大小减一,相当于将这个值删除了。这种算法在要移除的元素很少的情况下效率很高
public int removeElement(int[] nums, int val) {
int i = 0;
int n = nums.length;
while (i < n) {
if (nums[i] == val) {
nums[i] = nums[n - 1];
// reduce array size by one
n--;
} else {
i++;
}
}
return n;
}