> 文档中心 > 26. 删除有序数组中的重复项

26. 删除有序数组中的重复项

目录

 一.题目

二.原题链接

三:思路分析

四.代码

五.知识点

六:参考


 一.题目

26. 删除有序数组中的重复项

难度简单2549收藏分享切换为英文接收动态反馈

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

判题标准:

系统会用下面的代码来测试你的题解:

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 。不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按 升序 排列

二.原题链接

(75条消息) 《画解数据结构》(1 - 1)- 顺序表_英雄哪里出来的博客-CSDN博客

 26. 删除有序数组中的重复项 - 力扣(LeetCode) (leetcode-cn.com)

三:思路分析

      1.不要使用额外的空间,你必须在 原地 修改输入数组 

      2.使用 快慢指针

四.代码

int removeDuplicates(int* nums, int numsSize){    //(1)定义 快慢变量    int low = 0,fast = 1;    //(2)当快变量达到边界 运行结束    while(fast < numsSize){ //(3)变量值重复,快变量右移 if(nums[fast] == nums[low]){     //(4)变量值不同,改变下一位数值     fast++; }else{     nums[low + 1] = nums[fast];   (   //5)慢变量位数加一 ++low;  }    }    return low + 1;//(6)因为输出的是数组,所以要大一位}

(1)定义 快慢变量
(2)当快变量达到边界 运行结束
(3)变量值重复,快变量右移
(4)变量值不同,改变下一位数值
(5)慢变量位数加一
(6)因为输出的是数组,所以要大一位

五.知识点

   快慢指针

六:参考

(75条消息) 二分查找、双指针、滑动窗口算法技巧总结_没事请叫我去学习的博客-CSDN博客