前言
数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖。
快慢指针
解题思路
- 快指针:寻找新数组的元素,然后更新
- 慢指针:要更新的位置
class Solution {
/**
* 快指针:寻找新数组的元素,然后更新
* 慢指针:要更新的位置
* @param nums
* @param val
* @return
*/
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;
}
}
对碰指针
解题思路
左边找删除的值,右边找不需要删除的值,左边和右边的值进行交换,最终左边区域的值就是有效的部分(删除了指定元素后,还剩下的元素)
class Solution {
/**
* 对碰双指针
* 目标:左边是有效的部分,右边是无效部分
* left 找要删除的值
* right 找不要删除的值
* @param nums
* @param val
* @return
*/
public int removeElement(int[] nums, int val) {
// 定义慢指针
int left = 0;
int right = nums.length - 1;
while (left <= right) {
// 交换
if (nums[left] == val && nums[right] != val) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
// left 找要删除的值
if (nums[left] != val) {
left++;
}
//right 找不要删除的值
if (nums[right] == val) {
right--;
}
}
return left;
}
}