【leetcode系列】26. 删除排序数组中的重复项

这是一篇关于LeetCode第26题的解题文章。通过使用双指针技巧,在原地修改排序数组以删除重复元素,保持每个元素只出现一次。题目要求在O(1)额外空间复杂度下完成。示例展示了如何处理包含重复元素的数组。文章强调了排序在算法中的重要性。
摘要由CSDN通过智能技术生成

题目地址

https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/

题目描述

给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。


不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。


示例 1:


给定数组 nums = [1,1,2], 


函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 


你不需要考虑数组中超出新长度后面的元素。

示例 2:


给定 nums = [0,0,1,1,1,2,2,3,3,4],


函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。


你不需要考虑数组中超出新长度后面的元素。

说明:


为什么返回数值是整数,但输出的答案是数组呢?


请注意,输入数组是以“引用”方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。


你可以想象内部操作如下:


// nums is passed in by reference. (i.e., without making a copy)	
int len = removeDuplicates(nums);	
// any modification to nums in your function would be known by the caller.	
// using the length returned by your function, it prints the first len elements.	
for (int i = 0; i < len; i++) {	
    print(nums[i]);	
}

思路

使用快慢指针来记录遍历的坐标。

  • 开始时这两个指针都指向第一个数字

  • 如果两个指针指的数字相同,则快指针向前走一步

  • 如果不同,则两个指针都向前走一步

  • 当快指针走完整个数组后,慢指针当前的坐标加1就是数组中不同数字的个数

640?wx_fmt=gif

关键点解析

  • 双指针

这道题如果不要求,O(n)的时间复杂度, O(1)的空间复杂度的话,会很简单。 但是这道题是要求的,这种题的思路一般都是采用双指针

  • 如果是数据是无序的,就不可以用这种方式了,从这里也可以看出排序在算法中的基础性和重要性。

代码

/*	
 * @lc app=leetcode id=26 lang=javascript	
 *	
 * [26] Remove Duplicates from Sorted Array	
 *	
 * https://leetcode.com/problems/remove-duplicates-from-sorted-array/description/	
 *	
 * algorithms	
 * Easy (39.76%)	
 * Total Accepted:    539.7K	
 * Total Submissions: 1.4M	
 * Testcase Example:  '[1,1,2]'	
 *	
 * Given a sorted array nums, remove the duplicates in-place such that each	
 * element appear only once and return the new length.	
 * 	
 * Do not allocate extra space for another array, you must do this by modifying	
 * the input array in-place with O(1) extra memory.	
 * 	
 * Example 1:	
 * 	
 * 	
 * Given nums = [1,1,2],	
 * 	
 * Your function should return length = 2, with the first two elements of nums	
 * being 1 and 2 respectively.	
 * 	
 * It doesn't matter what you leave beyond the returned length.	
 * 	
 * Example 2:	
 * 	
 * 	
 * Given nums = [0,0,1,1,1,2,2,3,3,4],	
 * 	
 * Your function should return length = 5, with the first five elements of nums	
 * being modified to 0, 1, 2, 3, and 4 respectively.	
 * 	
 * It doesn't matter what values are set beyond the returned length.	
 * 	
 * 	
 * Clarification:	
 * 	
 * Confused why the returned value is an integer but your answer is an array?	
 * 	
 * Note that the input array is passed in by reference, which means	
 * modification to the input array will be known to the caller as well.	
 * 	
 * Internally you can think of this:	
 * 	
 * 	
 * // nums is passed in by reference. (i.e., without making a copy)	
 * int len = removeDuplicates(nums);	
 * 	
 * // any modification to nums in your function would be known by the caller.	
 * // using the length returned by your function, it prints the first len	
 * elements.	
 * for (int i = 0; i < len; i++) {	
 * print(nums[i]);	
 * }	
 * 	
 */	
/**	
 * @param {number[]} nums	
 * @return {number}	
 */	
var removeDuplicates = function(nums) {	
    const size = nums.length;	
    let slowP = 0;	
    for (let fastP = 0; fastP < size; fastP++) {	
        if (nums[fastP] !== nums[slowP]) {	
            slowP++;	
            nums[slowP] = nums[fastP]	
        }   	
    }	
    return slowP + 1;	
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值