27. 移除元素
移除元素并不是真正的移除,而是将未被元素调换到数组的前部
较快的解决办法:就是遍历整个数组
如果数组中的元素满足**!=val的条件,那么就把这个元素“挪动”到数组的前部,遍历结束的时候,整个数组也就完成了元素的前部置换,也就满足了题目的要求,index的大小自然随着挪动次数的自增就是移除val值元素之后的数组元素个数**
该解法的不足之处
挪动元素的操作执行了nums.length次,在起始元素不为val时,显然其中很多次挪动操作可能是无意义的,执行的很可能是nums[i]=nums[i]此类的无意义操作
且只要数组元素中存在==val的元素,就会引起后续元素的全部替换,
public int removeElement(int[] nums, int val) {
int index = 0;
for(int num : nums){
if(num != val){
nums[index++] = num;
}
}
return index;
}
双指针
注意int right = nums.length-1;
与while (left <= right)
的对应关系
解法思路
left指针从左到右移动,right指针从右向左移动,二者碰撞之时算法结束
算法不判断right值是否**==val**,而是直接与nums[left]进行替换操作,在一次while循环中 left指针和right指针中的一个进行移动
如发现替换后的nums[left]值仍然是值==val的需被移除元素,则继续用*nums[right]与nums[left]**替换。
当left指针与right指针碰撞之时,算法结束
**if (nums[left] == val)使得算法减少了很多无意义的替换操作,left的值随着left++**移动也就是移除元素后数组的长度
class Solution {
public int removeElement(int[] nums, int val) {
int left = 0;
int right = nums.length-1;
while (left <= right) {
if (nums[left] == val) {
nums[left] = nums[right];
right--;
} else {
left++;
}
}
return left;
}
}
#算法刷题与整理/数组
#算法刷题与整理/双指针