LeetCode 26 删除有序数组中的重复项(看完必会)

简介: LeetCode 26 删除有序数组中的重复项(看完必会)

LeetCode 26  详解


题目


给你一个升序排列 的数组 nums ,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有k个元素,nums的前k个元素应该保存最终结果。将最终结果插入nums的前k个位置后返回k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。


思路分析


(1)当我第一次看到这个题目的时候,我脑子里面的第一想法就是双层for循环+if判断(去重) ,事实证明还是有那么一点点肌肉记忆的

(2)我的想法是定义变量ij,用于表示两个不同的元素,但是写到后面我发现,如果我是用两个变量去计算的话,我无法表达出去重的效果,后来就手足无措了,不知道怎么解决


代码实现


int removeDuplicates(int* nums, int numsSize){
    int i, j;
    for(i = 1, j = 0; i < numsSize; i++)
    {
        if(nums[i] == nums[j])
        {
            continue;
        }
        nums[++j] = nums[i];
    }
    return ++j;
}
复制代码


代码详解


(1)代码的第一行并没有出乎我的意料之外(看来跟我想的一样),但是值得注意的是:它这里定义的ij是用于表示快慢指针,这一题本质上是用指针来进行比较的

(2)使用for循环遍历数组,这一题比较好的地方在于它ij放在了同一个for循环里面,从而避免了双层for循环给读者带来的困扰

(3)使用if进行判断,如果数组nums里面的ij相等的话,就跳转到赋值操作

重点解析:这里之所以进行赋值操作是因为代码中存在快慢指针,这两个指针存在的意义即为:快指针大步走,慢指针慢慢走并匹配元素

。这里可以理解为一快一慢同时遍历一个数组一旦遇到相同的就交换数值并把快指针前进一位,读者亦可以把慢指针看作一个搬运的角色,不断的往前进直到匹配完全部的元素

(4)由于题目要求返回具体数组的长度,所以根据上述操作我们返回慢指针j的长度就可以了,至于为什么要先自增,我只能说:慢指针移动一次才算一次结果,你觉得呢?

相关文章
|
1月前
|
算法
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
LeetCode刷题---167. 两数之和 II - 输入有序数组(双指针-对撞指针)
|
1月前
|
存储 C语言
【C语言】Leetcode 88.合并两个有序数组
【C语言】Leetcode 88.合并两个有序数组
25 0
【C语言】Leetcode 88.合并两个有序数组
|
1月前
|
存储
【合并两个有序数组】LeetCode第88题讲解
【合并两个有序数组】LeetCode第88题讲解
|
9天前
【力扣】80.删除有序数组中的重复项Ⅱ
【力扣】80.删除有序数组中的重复项Ⅱ
|
21天前
|
存储
【力扣经典面试题】80. 删除有序数组中的重复项 II
【力扣经典面试题】80. 删除有序数组中的重复项 II
|
1月前
LeetCode刷题---80. 删除有序数组中的重复项 II(双指针)
LeetCode刷题---80. 删除有序数组中的重复项 II(双指针)
|
1月前
LeetCode刷题---26. 删除有序数组中的重复项(双指针)
LeetCode刷题---26. 删除有序数组中的重复项(双指针)
|
2月前
|
Java
LeetCode题解-合并K个有序数组-Java
合并K个有序数组-Java
10 0
|
27天前
|
机器学习/深度学习 算法
力扣刷题日常(一)
力扣刷题日常(一)
20 2
|
1月前
|
存储 索引
《LeetCode》—— LeetCode刷题日记
《LeetCode》—— LeetCode刷题日记

热门文章

最新文章