今天分享下leetCode算法题,原地删除数组中给定值的所有元素并返回新的数组长度,以及新长度数组的值
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.
Example 1:
Given nums = [3,2,2,3], val = 3,
Your function should return length = 2, with the first two elements of nums being 2.
It doesn't matter what you leave beyond the returned length.
Example 2:
Given nums = [0,1,2,2,3,0,4,2], val = 2,
Your function should return length = 5, with the first five elements of nums containing 0, 1, 3, 0, and 4.
Note that the order of those five elements can be arbitrary.
It doesn't matter what values are set beyond the returned length.
先来看下问题思路:
问题要求我们原地删除给定值所有的元素,我们就必须用O(1)的额外空间来处理。如何解决?
我们可以保留两个指针,i和j,其中i为慢指针,j为快指针。
算法:
当nums[j]与给定的值相等时,递增j跳过该元素。只要nums[j]不等于给定值我们就将下标为j的元素值复制到下标为i的元素,
并同时递增两个指针,重复这一过程,知道j到达数组末尾,移除掉 指定元素的新数组长度就是i
java代码:
public static int removeElement(int[] nums, int val){
if(nums.length<1) return 0;
int i=0;
for(int j=0;j<nums.length;j++){
if(val!=nums[j]){
nums[i]=nums[j];
i++;
}
}
return i;
}
数组及给定值:
int[] nums = new int[]{0,1,2,2,3,0,4,2};
int val = 2;
结果: