leetcode题解:26.删除有序数组重复项

简介: leetcode题解:26.删除有序数组重复项

简单

提示

给你一个 非严格递增排列 的数组 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;
    }
};

推荐学习 https://xxetb.xetslk.com/s/p5Ibb

目录
相关文章
|
1月前
|
存储 C语言
Leetcode—— 删除排序数组中的重复项——C语言
Leetcode—— 删除排序数组中的重复项——C语言
|
22天前
|
存储 算法 Java
【经典算法】LeetCode 26. 删除有序数组中的重复项:(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 26. 删除有序数组中的重复项:(Java/C/Python3实现含注释说明,Easy)
12 2
|
8天前
|
存储 算法
leetcode题解:88.合并有序数组
leetcode题解:88.合并有序数组
11 0
|
18天前
|
存储 算法 数据挖掘
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
LeetCode 题目 88:双指针\直接\递归\插入排序\归并排序 实现合并两个有序数组
|
18天前
|
数据采集 算法 数据挖掘
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
LeetCode 题目 80:删除排序数组中的重复项 II【算法面试高频题】
|
18天前
|
SQL 算法 数据可视化
LeetCode第26题:删除排序数组中的重复项
LeetCode第26题:删除排序数组中的重复项
|
30天前
|
存储 搜索推荐
题目----力扣--合并两个有序数组
题目----力扣--合并两个有序数组
18 0
|
1月前
|
存储 搜索推荐 C语言
Leetcode—合并两个有序数组—C语言
Leetcode—合并两个有序数组—C语言
|
1月前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
17 0
|
1月前
leetcode代码记录(有序数组的平方
leetcode代码记录(有序数组的平方
16 0