题目
提供一个数组和一个值,移除数组中与提供的值相同的数,并返回数组新的长度。
要求
不能分配新的数组空间,空间复杂度限制在O(1)。
例子 1:
nums = [3,2,2,3], val = 3,
返回length = 2,同时数组前两个元素为2,2。
例子 2:
nums = [0,1,2,2,3,0,4,2], val = 2,
返回length = 5,同时数组前5个元素为0,1,3,0,4。
题解
超级简单的一题,将给定数组里面的val值移除,要求不能额外申请数组空间即空间复杂度为O(1),并且时间复杂度为O(n)。我们从反方向思考,定义一个计数器count,把和val不同的值直接存储在下标为count上,即从下标为0开始,每次存储后count+1。
过程
nums | count |
---|---|
初始 [0,1,2,2,3,0,4,2] | 0 |
[0 ,1,2,2,3,0,4,2] | 1 |
[0,1 ,2,2,3,0,4,2] | 2 |
[0,1,2,2,3,0,4,2] | 0 |
[0,1,2,2,3,0,4,2] | 0 |
[0,1,3 ,2,3,0,4,2] | 3 |
[0,1,3,0 ,3,0,4,2] | 4 |
[0,1,3,0,4 ,0,4,2] | 5 |
[0,1,3,0,4,0,4,2] | 5 |
class Solution {
public int removeElement(int[] nums, int val) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != val) {
nums[count++] = nums[i];
}
}
return count;
}
}