重点是:数组是连续的,快指针始终在前面,遍历过的元素就不要了,刚好留着前面空间让慢指针存储元素
- 暴力解法(两个for循环,第一层遍历,找到元素后,第二层向前移动后面元素)
- 双指针:
- 快指针遍历元素,慢指针存储新元素;
- 没找到就一起向前移动指针,找到了就跳过,只有快指针移动
- 慢指针每一次赋值都是指向下一个要检查的元素
方法一:暴力破解法
// 暴力解法(两个for循环,第一层遍历,找到元素后,第二层向前移动后面元素)
public int removeElement(int[] nums, int val) {
int size = nums.length;
for (int i = 0; i < size; i++) {
if (nums[i] == val) {
for (int j = i; j < nums.length-1; j++) {
nums[j] = nums[j + 1];
}
i--; //因为这个元素被第二层刷新了,重新赋值,需要重新判断
size--;//移动后,少了一位
}
}
return size;
}
方法二:双指针法
public int removeElement(int[] nums, int val) {
int slow = 0; //慢指针
for (int fast = 0; fast < nums.length; fast++) { //快指针遍历
if (nums[fast] != val) { //只有找不到元素,才给慢指针赋值,是需要的数据,否则只有快指针移动
nums[slow] = nums[fast];
slow++; //指向下一个需要检查的元素
}
}
return slow; //从0开始,数字是下个检查元素,和长度相等
}