各位题友大家好! 今天是 @负雪明烛 坚持日更的第 84 天。今天力扣上的每日一题是「26. 删除有序数组中的重复项」。
解题思路
题意:删除有序数组重复项,把去重后的数字放在输入数组的前面 n 个位置,返回 n.
看到题目标题的第一反应,当然是用 set
!set 就是为了实现去重的。但是题目要求我们进行原地操作,并且时间复杂度是 $O(1)$,因此就不能开辟另外的空间。
双指针
题目需要我们把去重后的结果保存到原本的数组中,所以想到必须有一个指针指向当前需要把结果放在哪个位置。还要一个指针指向当前应该放到哪个元素。
- 慢指针作为基准,快指针用于寻找与慢指针不同的元素。
- 如果快指针和慢指针指向的元素不等,则把快指针指向的元素放到慢指针的下一个位置。
- 慢指针右移,把新的元素作为基准。
代码
给了 Python, C++, Java 三种不同的写法。
class Solution(object):
def removeDuplicates(self, nums):
N = len(nums)
left = 0
for right in range(1, N):
if nums[right] != nums[left]:
left += 1
nums[left] = nums[right]
return left + 1
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
const int N = nums.size();
if (N == 0) return 0;
int left = 0;
for (int right = 1; right < N; ++right) {
if (nums[left] != nums[right]) {
nums[++left] = nums[right];
}
}
return left + 1;
}
};
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length == 0) return 0;
int left = 0;
for (int right = 1; right < nums.length; right++) {
if (nums[right] != nums[left]) {
nums[++left] = nums[right];
}
}
return left + 1;
}
}
- 时间复杂度:$O(N)$
- 空间复杂度:$O(1)$
刷题心得
今天题目不难,定义任何一个变量的时候,都要清晰记得这个变量的含义。
参考资料:
26. Remove Duplicates from Sorted Array
OK,以上就是 @负雪明烛 写的今天题解的全部内容了,如果你觉得有帮助的话,求赞、求关注、求收藏。如果有疑问的话,请在下面评论,我会及时解答。
关注我,你将不会错过我的精彩动画题解、面试题分享、组队刷题活动,进入主页 @负雪明烛 右侧有刷题组织,从此刷题不再孤单。
祝大家 AC 多多,Offer 多多!我们明天再见!