26. 删除有序数组中的重复项-双指针实现方式--LeetCode
前言
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
个人题目理解:
根据题目描述,给定一个有序数组,在不使用额外空间的情况下。把数组里的重复元素给删除了。这里比较容易混淆的点是,不一定非得删除其他元素。而是可以把不重复的元素往前放。
思路
根据我的个人理解,数组元素的其他位置是可以被覆盖的,所以我使用了双指针,一个慢指针,和一个快指针。慢指针用于确定要被覆盖的元素位置,而快指针是用于扫描不重复的元素。然后把不重复的元素赋值给 慢指针+1的位置,一次类推。就可以把所有不重复的元素给排到数组的前几个。
因为每找到一个不重复元素,慢指针都加一,所以最后返回慢指针+1 就是整个有序数组的去重之后的长度。
慢指针 +1 是因为索引是从零开始的所以把零也算上
用例
public static void main(String[] args) {
//示例1
int[] nums = new int[]{1,1,2};
int[] nums1 = new int[]{0,0,1,1,1,2,2,3,3,4};
int i = removeDuplicates(nums1);
System.out.println(i);
}
代码实现
public static int removeDuplicates(int[] nums) {
int left=0; //相对固定索引 和 每次循环都变的值right对比
for (int right = 0; right < nums.length; right++) {
if(nums[right]!=nums[left]){
//把不相等的值赋值给,left后面的元素
nums[left+1]=nums[right];
//索引加一
left++;
}
}
return left+1;
}
结果
欢迎访问csdn的博客:
https://blog.csdn.net/kangshihang1998?spm=1010.2135.3001.5343
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律