问题链接
LeetCode 26. Remove Duplicates from Sorted Array
题目解析
给定有序数组,删除其中重复元素,返回新数组长度。
解题思路
由于不是很懂题目的意思,题目要求不要分配额外的数组空间,其实是想说保证空间复杂度为 \(O(1)\)。
简单题。了解一下,std::unique。unique函数要求有序数组,需要注意的是unique函数并不是真正地把元素删除,而是将重复的元素移动到最后了,该函数返回最后一个非重复元素的下一位置。所以,使用unique函数后,再用erase函数删除元素。
参考代码
class Solution { public: int removeDuplicates(vector<int>& nums) { nums.erase(unique(nums.begin(), nums.end()), nums.end()); return nums.size(); } };
快慢指针
使用快慢指针(cur & pre)来记录遍历的坐标,初始两个指针都指向第一个数字,如果两个指针指的数字相同,则快指针+1;如果不同,则两个指针都+1。当快指针到达数组尾部,慢指针当前的坐标加1就是数组中不同数字的个数。参考代码如下:
class Solution { public: int removeDuplicates(vector<int>& nums) { if (nums.empty()) return 0; int pre = 0, cur = 0, len = nums.size(); while (cur < len) { if (nums[pre] == nums[cur]) ++cur; else nums[++pre] = nums[cur++]; } return pre + 1; } };
官方解法
官方链接:https://leetcode.com/problems/remove-duplicates-from-sorted-array/solution/。
其实官方解法就是上面的快慢指针,其中 \(i\) 就是 \(pre\),\(j\) 就是 \(cur\)。
class Solution { public: int removeDuplicates(vector<int>& nums) { if (nums.empty()) return 0; int j = 0, n = nums.size(); for (int i = 0; i < n; ++i) { if (nums[i] != nums[j]) nums[++j] = nums[i]; } return j + 1; } };
LeetCode All in One题解汇总(持续更新中...)
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
来源:https://www.cnblogs.com/AlvinZH/p/8549242.html