当前位置: 首页 > article >正文

leetcode第80题:删除有序数组中的重复项 II

题目描述

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成

示例 1:

输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前五个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。

整体思路: 这是一个有序的数组,出现重复的数子只会在一起。因为我们找到一个重复数字之后就需要立即删除,导致数组后边的元素会一直发生元素的序号变化,所以我们采用从后往前的方法。使用两个指针,一个指针s,一个指针j,如下图:
在这里插入图片描述
设置一个计数器,1.当重复元素超过2时,就将当前元素后面的所有元素向前移一位。移完之后因为之前s指针指向的还是之前的位置,因此要减一。只有发生移位时,数组的长度才会发生变化。2.当两个元素不相同时,就将s指针指向j,并且将计数器重置为1。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

class Solution {
public:

    //将数组当前的这个删除并且移动元素
    void move(vector<int>& nums,int pre){
        for(int i=pre ; i<nums.size()-1 ; i++){
            nums[i]=nums[i+1];
        }
    }
    int removeDuplicates(vector<int>& nums) {
        int count=nums.size();//记录nums的元素个数
        int s=nums.size()-1;	//指针s
        while (s>1)		//只剩最后一个元素时不用再检查了
        {   
            int renum=1;//计数器,自己就是一个,所以设置为1
            for(int j=s-1;j>=0;j--){
                
                if(nums[s]==nums[j]){
                    renum++;
                    //每次删除操作时,数组的长度就减 1
                    if(renum>2){
                        move(nums,j);
                        s--;
                        count--;
                    }
                }else{
                    s=j;
                    renum=1;
                }
            }
            
        }
        
        
        return count;
    }
    
};
int main(){
    vector<int> nums={1,1,1,2,2,3};
    Solution s;
    cout<<s.removeDuplicates(nums);
}

在这里插入图片描述


http://www.kler.cn/a/106160.html

相关文章:

  • STL序列式容器之list
  • 华东师范大学数学分析第五版PDF习题答案上册及下册
  • 定时器简介
  • PCB+SMT线上报价系统+PCB生产ERP系统自动化拼板模块升级
  • 计算机视觉 1-8章 (硕士)
  • vue+svg圆形进度条组件
  • SourceTree 使用
  • cocosCreator 之 crypto-es数据加密
  • 计讯物联外贸公司--佰沃恩应邀出席第三届“嘉庚论坛”—科技创新推动经济高质量发展分论坛
  • 【IT行业就业前景广阔:探讨热门方向与就业机会】
  • 解决node项目一个极度困难的捕获异常却无法读取异常信息的问题
  • 189. 轮转数组 --力扣 --JAVA
  • 第五章单元测试
  • Linux - 进程的优先级 和 如何使用优先级调度进程
  • PyQt5的一些问题(持续更新中)
  • npm install报错 缺少python
  • 支持自动生成API文档 Apipost 真香
  • python实验16_网络爬虫
  • 进一步了解视频美颜SDK:美颜SDK的技术原理
  • C++设计模式_12_Singleton 单件模式
  • LeetCode 64.最小路径和(开辟额外空间(二维)、不开辟额外空间(二维)、优化(一维))
  • HarmonyOS开发:NodeJs脚本实现组件化动态切换
  • 好数组——尺取法
  • Xcode iOS app启用文件共享
  • npm改变npm缓存路径和改变环境变量
  • 腾讯云新用户优惠券领取方法及使用教程