云小杰

相对于绝对成功的汲汲渴求,越无杂质的奔赴,越是动人。

要一个黄昏, 满是风, 和正在落下的夕阳。如此, 足够我爱这破碎泥泞的人间。


Download the theme

移除元素

27. 移除元素

题目描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例1:

输入nums = [3,2,2,3], val = 3
输出2, nums = [2,2]
解释函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2你不需要考虑数组中超出新长度后面的元素例如函数返回的新长度为 2  nums = [2,2,3,3]  nums = [2,2,0,0]也会被视作正确答案

示例2:

输入nums = [0,1,2,2,3,0,4,2], val = 2
输出5, nums = [0,1,4,0,3]
解释函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4注意这五个元素可为任意顺序你不需要考虑数组中超出新长度后面的元素

方法一:双指针

此题与26. 删除有序数组中的重复项相似,都是要求不能使用额外的数组空间,所以我们通道可以使用双指针。

  • 显然,输出的数组长度是短于输入数组的,所以我们可以考虑覆盖原数据。
  • 定义快慢指针 leftrightright从头开始遍历,只要遇到 nums[right]!=val 的情况,便把 nums[right] 的值赋给 nums[left],同时 left1
  • 这样的算法在最坏情况下(输入数组中没有元素等于 $\textit{val}$ ),左右指针各遍历了数组一次。
class Solution {
    public int removeElement(int[] nums, int val) {
        int length = nums.length;
        int left = 0;
        for (int right=0;right<length;++right) {
            if (nums[right] != val) {
                nums[left] = nums[right];
                ++left;
            }
        }
        return left;
    }
}

方法二:双指针优化

既然题目对剩余元素的顺序没有要求,我们可以让leftright分别从数组的开头和结尾开始遍历。

  • nums[right]!=val,便把 nums[right] 的值赋给 nums[left],同时 right减去 1
  • 否则 left1
  • 这样的方法两个指针在最坏的情况下合起来只遍历了数组一次。
class Solution {
    public int removeElement(int[] nums, int val) {
        int length = nums.length;
        int left = 0, right = length - 1;
        while (left <= right) {
            if (nums[left] == val) {
                nums[left] = nums[right];
                --right;
            } else {
                ++left;
            }
        }
        return left;
    }
}
最近的文章

删除元素中的重复项

26. 删除有序数组中的重复项题目描述给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums 的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。将最终结果插入 nums 的前 k 个位置后返回 k 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(...…

继续阅读
更早的文章

最接近的三数之和

16. 最接近的三数之和题目描述给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数,使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。示例:输入:nums = [-1,2,1,-4], target = 1输出:2解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。方法:排序+双指针本题与三数之和类似,都可以使用排序+双指针的方式来实现。 其实最简单可以使用三层循环暴力求解,但是...…

继续阅读