本文共 1675 字,大约阅读时间需要 5 分钟。
给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。嵌套循环,外层控制元素,判断 当前位置的 元素 是否和 近邻 的元素重复
若重复,进入内层循环,将 后面的全部元素 整个向前覆盖一步,即删除 重复的第一个元素
需要注意的是:
i
需要保持当前位置 即加上 i --
class Solution { public int removeDuplicates(int[] nums) { int count = 0; for(int i = 0;i
之前遇到的 链表双指针,判断链表是否有环(快慢指针) 、删除链表倒数第n个节点(间隔指针)
参考往期博客:
注意题目给的是有序数组,这样才能实现
思路
i
作为下标 指针 处理 有效的元素,永远指向 最后一个有效元素j
作为另一个下标指指针 跑在 i
之前, nums[i]
相等的元素,就 直接跳过,不用处理,对应i
和j
的距离加一nums[i]
不相等的元素,就 i ++ 为有效元素找位置,然后 nums[i] = nums[j];
class Solution { public int removeDuplicates(int[] nums) { if(nums.length == 0){ return 0; } //双指针 int i = 0; for(int j = 1;j
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-element 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。有了双指针的思想,果然好实现多了,和上面的基本一样,
只不过需要注意的地方是
j = 0
开始class Solution { public int removeElement(int[] nums, int val) { if(nums.length == 0){ return 0; } if(nums.length == 1 && nums[0] == val){ return 0; } //双指针 //需要注意的是 i 从 -1开始,即处理 nums[0] 存在待删除元素 int i = -1; for(int j = 0;j