记录:这题的情景有点像剑指的场景,但仔细读题后(很重要),剑指里表明的是N个数,数值大小都在0~N-1范围内,可以利用元素间交换到正确位置的思想,本题没有这样表述,不能套用
题目
- https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/
思路:
- 题目要求O(1)的空间,很明显是双指针问题,定义两个指针,一个快指针index,一个慢指针i(慢指针起到了计数的作用),快指针向前移动,若nums[ index ]不等于nums[ i ] ,则nums[ ++i ] = nums[ index ] (把不同元素拷贝一份了),若相等,慢指针不动,快指针向前移动一位置。重复上述操作。
复杂度分析:
- 时间复杂度:线性查找n个元素,则 O(n)
- 空间复杂度:只用一个数组空间,则O(1)
class Solution { public: int removeDuplicates(vector<int>& nums) { auto i = 0; if( nums.size() == 0 ) return 0; for( auto index = 1; index < nums.size(); ++index ) { if( nums[ index ] != nums[ i ] ){ //核心思想,同时也保存下来着不重复的项 ++i; nums[ i ] = nums[ index ]; } } return i + 1; } };