解法一:双指针法
-
时间复杂度:O(n), 假设数组总共有 n 个元素,i 和 j 至少遍历 2n 步。
-
空间复杂度:O(1)。
JAVA:
public int removeElement(int[] nums, int val) {
int i = 0;
for (int j = 0; j < nums.length; j++) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
}
return i;
}
Python
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) <= 1:
return len(nums)
s = 0
for f in range(1, len(nums)):
if nums[s] != nums[f]:
s += 1
nums[s] = nums[f]
return s + 1
解法二:双指针---当要删除的元素很少时
第一种解法在num=[4,1,2,3,5],val=4时。其实并没有必要将[1,2,3,5]这四个元素左移一步,因为该问题中可以不考虑元素顺序。
当遇到num[i]=val时,我们可以把当前元素与最后一个元素进行交换,并释放最后一个元素。这实际上使得数组大小减少了1。
复杂度分析
-
时间复杂度:O(n)O(n),ii 和 nn 最多遍历 nn 步。在这个方法中,赋值操作的次数等于要删除的元素的数量。因此,如果要移除的元素很少,效率会更高。
-
空间复杂度:O(1)O(1)。
JAVA:
public int removeElement(int[] nums, int val) {
int i = 0;
int n = nums.length;
while (i < n) {
if (nums[i] == val) {
nums[i] = nums[n - 1];
// reduce array size by one
n--;
} else {
i++;
}
}
return n;
}