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

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

ds复杂度分析:

  1. 双指针遍历:使用两个指针ij,其中i指向待填充的位置,j用于遍历数组。两个指针均单向移动,不会回退,保证了每个元素最多被访问一次。

  2. 处理重复元素

    • 连续重复元素:当nums[j] == nums[j+1]时,将这两个元素放到ii+1的位置,随后i增加2。接着通过内部while循环将j直接跳到第一个大于当前值的元素,跳过所有重复项。这部分操作使得每个重复元素仅被处理一次。
    • 无重复元素:直接交换ij的元素,并递增ij,每个元素处理一次。
  3. 操作次数:无论数组是否包含重复元素,每个元素最多被访问两次(一次由j遍历,另一次在while跳过重复时),但总体操作次数与数组长度成线性关系。

综上,算法的时间复杂度为 O(n),空间复杂度为 O(1)(原地修改数组)。

实测提交到leetcode时4-10ms居多,所以该做法时间复杂度比题解区大神做法略高,在此仅作提供思路用。

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int i, j, n = nums.size();  // 双指针,i为answer,j为operation
        for(i = 0,j = 0;j<n;) {
            if(j<n-1 && nums[j]==nums[j+1]) {  // 两个相同新元素
                int t = nums[j];
                swap(nums[i], nums[j]);
                swap(nums[i+1], nums[j+1]);
                i+=2;
                while(j<n && nums[j]<=t) j++;  // 利用数组的正序,保证下一个操作的元素是新的
            } else {
                swap(nums[i++],nums[j++]);
            }
        }
        return i;
    }
};

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

相关文章:

  • 48V电气架构全面科普和解析:下一代智能电动汽车核心驱动
  • 解锁Netty:Channel更替与HashMap管理的奇妙联动
  • 手写一个C++ Android Binder服务及源码分析
  • 【C++】命名空间
  • Golang 并发机制-7:sync.Once实战应用指南
  • vscode预览插件
  • 音视频协议
  • webpack配置之---output.chunkLoadTimeout
  • 如何解决 javax.xml.crypto.dsig.TransformException: 转换异常问题?亲测有效的解决方法!
  • 项目顺利交付,几个关键阶段
  • 2025年02月08日Github流行趋势
  • Ubuntu22.04部署deepseek大模型
  • element-ui使用el-table,保留字段前的空白
  • 掌握API和控制点(从Java到JNI接口)_39 JNI从C调用Java函数 02
  • 996引擎-问题处理:三职业改单职业
  • 【k8s应用管理】kubernetes pod资源控制管理(一)
  • MATLAB使用技巧之局部放大图的制作(二)
  • 通过Demo案例的形式弄懂Java中的设计模式
  • JMeter通过BeanShell如何对CSV文件的指定列追加数据
  • 智能理解 PPT 内容,快速生成讲解视频
  • 排错 -- 用React.js,Solidity,智能合约构建最新区块链应用
  • Pixel3XL 编译源码刷机教程
  • undetected-chromedriver 使用教程,指定浏览器驱动和浏览器版本
  • 运行npm install卡住不动的
  • 22.2、Apache安全分析与增强
  • 【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现