简单
提示
给你一个 非严格递增排列 的数组 nums
,请你** 原地** 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums
中唯一元素的个数。
考虑 nums
的唯一元素的数量为 k
,你需要做以下事情确保你的题解可以被通过:
- 更改数组
nums
,使nums
的前k
个元素包含唯一元素,并按照它们最初在nums
中出现的顺序排列。nums
的其余元素与nums
的大小不重要。 - 返回
k
。
判题标准:
系统会用下面的代码来测试你的题解:
int[] nums = [...]; // 输入数组 int[] expectedNums = [...]; // 长度正确的期望答案 int k = removeDuplicates(nums); // 调用 assert k == expectedNums.length; for (int i = 0; i < k; i++) { assert nums[i] == expectedNums[i]; }
如果所有断言都通过,那么您的题解将被 通过。
示例 1:
输入:nums = [1,1,2] 输出:2, nums = [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] 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
已按 非严格递增 排列
思路
1.利用已知条件简化流程:
a.非严格递增,即后一个元素大于等于前一个元素
b.只需要确保从nums[0]开始的k个唯一元素按原有相对顺序排列,后面的元素不用考虑
2.大胆考虑一次遍历解决问题,对于nums从索引0开始的每一个元素,我们都确保它唯一,由于数组非严格递增,出现相同的元素情况如下:112334,我们只需要判断出1 = 1,3 = 3的情况,因为1和2的交界处 1 != 2一定成立(我好像把读者当傻子了),所以简单的nums[i] != nums[i -1]就可以遍历判找出所有唯一元素
3.实现:我们需要两个索引,一个是i,遍历数组的每一个元素,另一个是k,每增加一个唯一元素,k+1
4.临界点:如果传入空数组,唯一元素个数是0,如果非空,那么至少第一个元素是非空的,所以k的初始值是1
题解
class Solution { public: int removeDuplicates(vector<int>& nums) { if (nums.empty()) return 0; int k = 1; // 当前的唯一元素数量,至少为 1 for (int i = 1; i < nums.size(); i++) { if (nums[i] != nums[i-1]) { // 第一个元素唯一,从第二个开始判断,它前面的元素是否和它相等,也就是判断他是不是当前唯一的元素,如果是就放在nums[k],因为它是第k-1个唯一的元素 nums[k] = nums[i]; k++; } } return k; } };