题目要求:输入一个数组和一个值,删除数组中等于该值得元素。不允许分配新的内存空间(即不允许创建新的数组),允许数组中的元素的顺序发生变化,只要该数组在返回长度前的值正确
例如:输入nums = [3,2,2,3], val = 3,程序返回2,且nums数组的前两个值均为2
使用一个指针
时间复杂度O(n), 空间复杂度O(1)
/**
* @author rale
* 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.
*/
public class RemoveElement {
public int removeElement(int[] nums, int val) {
int index = 0;
for(int i = 0 ; i<nums.length ; i++){
if(nums[i] != val){
nums[index]=nums[i];
index++;
}
}
return index;
}
}
使用两个指针
时间复杂度O(n) 空间复杂度O(1)
/**
* @author rale
* 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.
*/
public class RemoveElement {
public int removeElement(int[] nums, int val) {
if(nums==null || nums.length==0){
return 0;
}
int leftPointer = 0;
int rightPointer = nums.length-1;
while(leftPointer<=rightPointer){
if(nums[rightPointer]==val){
rightPointer--;
continue;
}
if(nums[leftPointer]==val){
nums[leftPointer] = nums[rightPointer];
rightPointer--;
}
leftPointer++;
}
return rightPointer+1;
}
}
leetcode的测试用例得出的性能分析发现,使用一个指针比使用两个指针的速度更快。但是在数组的容量非常大且数组中该数字出现频率不高的情况下,使用两个指针可以明显减少程序遍历数组的时间。
leetcode上也给出了参考答案
想要了解更多开发技术,面试教程以及互联网公司内推,欢迎关注我的微信公众号!将会不定期的发放福利哦~
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。