题目描述:
Given an array nums and a value val, remove all instances of that value in-place and return the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
The order of elements can be changed. It doesn’t matter what you leave beyond the new length.
问题分析:
循环不变量:假设等于val的地方是空当,如果我们总是把下一个非空当的值交换到第一个空当处,那么空当连续。既然是连续的就好办了,我们始终让lower指针在空当(想象它是条河)的左岸,higher指针始终向前探索。如果higher指针遇到空当则继续前进,如果非空当,就把它交换到lower的下一个位置。
代码不难,一次通过:
class Solution {
public int removeElement(int[] nums, int val) {
int hole_size = 0;
int lower = -1;
int temp = 0;
for (int higher=0; higher<nums.length; higher++){
if (nums[higher] == val){
hole_size++;
}
else {
if (hole_size>0){
//swap nums[lower+1] and nums[higher]
temp = nums[higher];
nums[higher]=nums[lower+1];
nums[lower+1] = temp;
}
lower++;
}
}
return lower+1;
}
}
``
时间复杂度:O(n)