题目:移除元素
链接:link
解决思路
思路一:拷贝覆盖
- 设置下标 i n d e x index index,从0开始,将与val不同的值拷贝到下标为 i n d e x index index的数组中,相同的直接跳过,不拷贝;
- 这种思路在移除元素较多时更适合使用,最极端的情况是全部元素都需要移除,遍历一遍结束即可;
- 时间复杂度: O ( n ) O(n) O(n),空间复杂度: O ( 1 ) O(1) O(1)
代码
/**
* 本类提供了一个解决方案,用于从整数数组中移除指定值的所有实例,并返回修改后数组的新长度。
* 方法 `removeElement` 实现了这一功能。
*
*/
class Solution {
/**
* 从输入的整数数组 `nums` 中移除所有值为 'val' 的元素。
* 该方法通过将非目标元素向左移动并保持其原始顺序的方式,就地修改数组。
* 函数返回移除过程完成后数组的新长度,
* 这个长度表示数组中不含指定值的有效元素个数。
*
* @param nums 待处理的整数数组,其中某些元素可能需要被移除
* @param val 需要从数组中移除的指定整数值
* @return 新的数组长度,即移除指定值后有效元素的数量
*/
public int removeElement(int[] nums, int val) {
int index = 0;
for (int i : nums) {
if (i != val) {
nums[index] = i;
index++;
}
}
return index;
}
}
思路二:双指针
- 设置两个指针, l o w low low指向首、初始值为0, h i g h high high指向尾、初始值为 n u m s . l e n g t h − 1 nums.length-1 nums.length−1
- 从 l o w low low开始,若当前值与 v a l val val相同,则与 h i g h high high处的值对调,然后 h i g h high high左移一个数;若不相同,则不需要做处理, l o w low low右移一个数;
- 这种思路在移除元素较少时更适合使用,最极端的情况是没有元素需要移除,遍历一遍结束即可;
- 时间复杂度: O ( n ) O(n) O(n),空间复杂度: O ( 1 ) O(1) O(1)
代码
/**
* 从输入的整数数组 `nums` 中移除所有值为 'val' 的元素。
* 该方法采用双指针策略,其中:
* - 'low' 指针从左到右扫描数组;
* - 'high' 指针起始于数组末尾并向 'low' 指针方向移动。
* 当 'low' 指针处的值等于 'val' 时,用 'high' 指针处的值替换之,
* 从而将非目标元素向数组左侧移动,并减小 'high' 指针。
* 当 'low' 和 'high' 指针相遇或交叉时,表明数组左侧已成功移除所有 'val' 实例。
* 函数返回移除过程完成后数组的新长度,
* 这个长度表示数组中不含指定值的有效元素个数。
*
* @param nums 待处理的整数数组,其中某些元素可能需要被移除
* @param val 需要从数组中移除的指定整数值
* @return 新的数组长度,即移除指定值后有效元素的数量
*/
class Solution {
public int removeElement(int[] nums, int val) {
int low = 0;
int high = nums.length -1;
while (low <= high ) {
if (nums[low] == val) {
if(nums[high] != val) {
nums[low] = nums[high];
}
high--;
} else {
low++;
}
}
return low;
}
}