Remove Element
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 in place with constant memory.
The order of elements can be changed. It doesn't matter what you leave beyond the new length.
Example:
Given input array nums = [3,2,2,3]
, val = 3
Your function should return length = 2, with the first two elements of nums being 2.
这个题有三个提示:
Hint:
- Try two pointers.
- Did you use the property of "the order of elements can be changed"?
- What happens when the elements to remove are rare?
//时间复杂度是O(n2)
public int removeElement(int[] nums,int val){
int deleteNumber = 0;
for(int i = 0;i < nums.length - deleteNumber;i++){
if(val == nums[i]){
deleteNumber++;
for(int j = i;j < nums.length - deleteNumber;j++){
nums[j] = nums[j+1];
}
i = i - 1;//这个题与26题去重不一样,此题是去除与val相同的数,所以删除重复数以后,i的值不变,接着判断i位置的新值
}
}
return nums.length - deleteNumber;
}
后面看了一下提示,对代码作了优化使得时间复杂度变为O(n),使用两个指针当从头遍历发现与val相等的元素时,用最后一个元素替换前面的元素,两个指针相应修改位置
//循环一次
public int removeElement2(int[] nums,int val){
int deleteNumber = 0;
for(int i = 0;i < nums.length - deleteNumber;i++){
if(nums[i] == val){
deleteNumber++;
nums[i] = nums[nums.length - deleteNumber];
i = i - 1;//当使用排序好的数组时,不需要加这一行
}
}
return nums.length - deleteNumber;
}