Related Topics:[Array][Two Pointers]
Similar Questions:[Remove Duplicates from Sorted Array][Remove Linked List Elements][Move Zeroes]
题目:Given an array and a value, 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.
思路
思路1:我们用一个变量用来计数,然后遍历原数组,如果当前的值和给定值不同,我们就把当前值覆盖计数变量的位置,并将计数变量加1。(我们习惯性去找与给定值相同的元素,换一种思路去找不同的元素操作起来更简单)
java解法1:
class Solution {
public int removeElement(int[] nums, int val) {
//两个指针
int idx=-1;
for(int i=0;i<nums.length;i++) {
if(nums[i]!=val) {
nums[++idx]=nums[i];
}
}
return idx+1;
}
}
思路2:看一个例子,nums = [4,1,2,3,5], val = 4。在这个例子中,如果使用解法1的思路,会产生很多不必要的复制过程。我们可以在这种情况下,可以通过用数组最后一个值覆盖当前与给定值相等的元素,并用一个变量记录实际数组的长度(此处减一)。最后返回该变量值即可
java解法2:
class Solution {
public int removeElement(int[] nums, int val) {
//遍历数组,用数组最后元素替换相同元素,并缩短数组长度
int n=nums.length;
int i=0;
while(i<n) {
if(nums[i]==val) {
nums[i]=nums[n-1];
n--;
} else {
i++;
}
}
return n;
}
}
网友评论