首页 > 其他分享 >26. 删除有序数组中的重复项 & 80. 删除有序数组中的重复项 II

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

时间:2023-04-08 10:11:06浏览次数:49  
标签:删除 idx nums int 元素 数组 num 有序

力扣题目链接(26)

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

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

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

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

示例 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 * 10^4
  • -10^4 <= nums[i] <= 10^4
  • nums 已按 升序 排列

解法一:

 1 class Solution {
 2     public int removeDuplicates(int[] nums) {
 3         if (nums.length == 0) {
 4             return 0;
 5         }
 6         int slow = 0, fast = 0;
 7         while (fast < nums.length) {
 8             if (nums[fast] != nums[slow]) {
 9                 slow++;
10                 // 维护 nums[0..slow] 无重复
11                 nums[slow] = nums[fast];
12             }
13             fast++;
14         }
15         // 数组长度为索引 + 1
16         return slow + 1;
17     }
18 }

解法二(删除有序数组中的重复项的通用解法,26题可以转化为保留1位,80题可以转化为保留2位,类似的可以保留K位):

通用模板:

 1 class Solution {
 2     public int removeDuplicates(int[] nums, int k) {
 3         int idx = 0;
 4         for (int num : nums) {
 5             if (idx < k || num != nums[idx - k])
 6                 nums[idx++] = num;
 7         }
 8         return idx;
 9     }
10 }

两个性质:

1.由于是保留 k 个相同数字,对于前 k 个数字,我们可以直接保留。
2.对于后面的任意数字,能够保留的前提是:与当前写入的位置前面的第 k 个元素进行比较,不相同则保留。

举个

标签:删除,idx,nums,int,元素,数组,num,有序
From: https://www.cnblogs.com/Co3y/p/17298037.html

相关文章

  • js数组对象如何改变里面对象键名
    方法二中,怎么就通过改变item,arr的值就直接改变了的呢?在JavaScript中,对象是引用类型,当你将一个对象赋值给一个变量时,实际上是将该对象的引用赋值给了变量,而不是复制了该对象本身letobj={name:'jack',age:23}letobj_son=obj;obj_son.name='tome'console.log(obj......
  • 一维数组的应用举例
    案例1从键盘读入学生成绩,找出最高分,并输出学生成绩等级成绩>=最高分-10等级为’A’成绩>=最高分-20等级为’B’成绩>=最高分-30等级为’C’其余等级为’D’提示:先读入学生人数,根据人数创建int数组,存放学生成绩。publicstaticvoidScoreTest(){//提示......
  • LeetCode习题——在排序数组中查找元素的第一个和最后一个位置(二分查找)
    在排序数组中查找元素的第一个和最后一个位置力扣链接:在排序数组中查找元素的第一个和最后一个位置题目给你一个按照非递减顺序排列的整数数组nums,和一个目标值target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值target,返回[-1,-1]。你......
  • 数组遍历方法: map、filter、forEach
    区别map叫映射,可以重新赋值,拼接用+号,值+另外的值得新值filter叫筛选数组,可以重新赋值,用><=号,比较筛选值forEach叫跟for循环一样,不可以重新赋值......
  • 1250. 检查「好数组」
    题目链接:1250.检查「好数组」方法:最大公约数gcd裴蜀定理简介(1)若\(a,b\)是整数,且\(gcd(a,b)=d\),那么对于任意的整数\(x,y\),\(ax+by\)都一定是\(d\)的倍数,特别地,一定存在整数\(x,y\),使\(ax+by=d\)成立。(2)推论:\(a,b\)互质gcd(a,b)=1的充分必要条件是存在整数\(x,y\)......
  • 1233. 删除子文件夹
    题目链接:1233.删除子文件夹方法一:排序+循环解题思路先对\(folder\)数组根据字典序进行排序,排序完成后,扫描\(folder\)数组。由于在同一个高层目录下的文件夹在同一段区域,那么这一段区域的第一个文件夹就是这一系列文件夹的最高层目录\((high)\),将其加入结果数组中。当出......
  • RMAN删除过期备份或非过期备份
    (一)删除备份--DELETE命令用于删除RMAN备份记录及相应的物理文件。当使用RMAN执行备份操作时,会在RMAN资料库(RMANRepository)中生成RMAN备份记录,默认情况下RMAN备份记录会被存放在目标数据库的控制文件中,如果配置了恢复目录(RecoveryCatalog),那么该备份记录也会被存放到恢复目录中。R......
  • 解构赋值(数组与对象都能解构赋值)
    ?就是左边有多个变量名对应赋值给右边的多个值数组的解构赋值还可以实现不用新建空变量名,完成相互换值操作可以给左边的变量名设置默认值,有则选对应,无则选默认值对象的解构赋值数组套对象的解构赋值多级对象解构拿里面对象的值(对象套对象)notice,拿数据的时候,可......
  • JS遍历数组的几种方法
    在JavaScript中,遍历数组有多种方法,下面介绍几种经典方法。for循环用for循环遍历数组是最基础、最原始的方法。constarr=[1,2,3,4,5];for(leti=0;i<arr.length;i++){console.log(arr[i]);}forEach()forEach()是ES5中新增的方法,用来遍历数组,可......
  • C-指针与数组
    指针与数组数组名是一个指向数组中第一个元素的常量指针.数字数组将一个指针指向一个数字数组,指针中存储了数组中第一个元素的地址.intarr1[]={1,2,3};int*p=arr1;printf("%d",*p);//1"指针表示法"printf("%d",p[0]);//1"数组表示法"printf("%d......