LeetCode每日一练 —— 26. 删除有序数组中的重复项

前言

Wassup guys!我是Edison

今天是 LeetCode 上的 leetcode 26. 删除有序数组中的重复项

Let’s get it!

在这里插入图片描述


文章目录

  • 1. 题目分析
  • 2. 题目图解
  • 3. 代码实现


1. 题目分析

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
 
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O ( 1 ) O(1) O(1) 额外空间的条件下完成。
 
其实这道题的根本就是 去重,把数组里面重复的元素删除掉,只保留一个

示例 1:
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第1张图片

示例 2:
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第2张图片

2. 题目图解

首先这道题可以使用 双指针 法;
 
首先,让 src 指向的元素,与 src-1也就是 src 的前一个元素)指向的元素相比较,如果 src 指向的元素与 src-1 指向的元素相等,那么 src 就向后挪动一位;
 
如果不相等,那么就把 src-1 指向的元素赋给 dst 的位置上去,然后 srcdst 同时向后挪动一位。

 
听起来可能有点绕?别慌,跟着图来一步一步的看!

但是稍微有点不同的就是,指针 src 指向下标为 1 的位置,指针 dst 还是指向起始位置,如图所示
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第3张图片

一开始 src 指向的元素和 src-1 指向的元素都是 0,也就是说 srcsrc-1 指向的元素相等,如图所示
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第4张图片

那么就把 src 往后挪动一位,dst 不变,如图所示
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第5张图片

此时 src 指向的元素是 1src-1 指向的元素是 0,它们的值不相等,那么就把 src-1 指向的元素赋给 dst 的位置上去;

然后 srcdst 同时向后挪动一位,如图所示
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第6张图片

此时 src 指向的元素是 1src-1 指向的元素是 1,它们的值相等;

那么 src 就往后挪动一位,dst 不变,如图所示
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第7张图片

此时 src 指向的元素是 2src-1 指向的元素是 1,它们的值不相等,那么就把 src-1 指向的元素赋给 dst 的位置上去;

然后 srcdst 同时向后挪动一位,如图所示
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第8张图片

此时 src 指向的元素是 2src-1 指向的元素也是 2,它们的值相等

那么 src 就往后挪动一位,dst 不变,如图所示
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第9张图片

此时 src 指向的元素是 3src-1 指向的元素是 2,它们的值不相等,那么就把 src-1 指向的元素赋给 dst 的位置上去;

然后 srcdst 同时向后挪动一位,如图所示
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第10张图片

此时 src 已经指向数组外面去了,那么就直接把最后一个值赋给 dst,然后 dst 再向后挪动一位
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第11张图片

因为你要把一个值放过去,那么一定是把这段区间走完,走到它下一个位置,跟上一个值不相等的时候,才会放过去

所以这道题的结构设计如下
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第12张图片
这道题的本质就是 srcsrc-1 的位置的值,不相等时,前一段重复值区间已经走完了,那么把最后一个保留放到 dst 的位置。

3. 代码实现

接口代码

int removeDuplicates(int* nums, int numsSize){
    int dst = 0;
    int src = 1;
    while (src < numsSize) {
        if (nums[src-1] == nums[src]) {
            src++;
        }
        else {
            nums[dst] = nums[src-1];
            src++;
            dst++;
        }
    }
    nums[dst] = nums[numsSize-1]; // 把最后一个值赋给dst
    return ++dst; // dst要向后挪动一位
}

提交结果
LeetCode每日一练 —— 26. 删除有序数组中的重复项_第13张图片

你可能感兴趣的:(算法刷题宝典,leetcode,算法,数据结构,c语言,删除有序数组中的重复项)