leetcode笔记:26.删除排序数组中的重复项

2023-11-15

package com.ko.leetcode.primaryAlgorithm.array;

/**
 * 《初级算法》
 * -数组
 * 1.删除排序数组中的重复项
 * @Author ko
 * @Date 2023/6/1 23:55
 * @Version 1.0
 */
public class removeDuplicatesSolution {

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

    考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

    更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
    返回 k 。
    判题标准:



    作者:LeetCode
    链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x2gy9m/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。*/

    //系统会用下面的代码来测试你的题解:
    public static void main(String[] args) {

        /*int[] nums = new int[]{1,1,2,2,3,3,4,5,6,6,7};*/// 输入数组
        /*int[]nums =  new int[]{0,0,1,1,1,2,2,3,3,4};*/
        int[]nums = new int[]{1,1};
        /*int[] expectedNums = new int[]{1,2,3,4,5,6,7};*/ // 长度正确的期望答案
        /*int[] expectedNums = new int[]{0,1,2,3,4};*/
        int[] expectedNums = new int[]{1};
        int k = removeDuplicates(nums); // 调用

        assert k == expectedNums.length;
        for (int i = 0; i < k; i++) {
            assert nums[i] == expectedNums[i];
        }
    }

    /**
     * 第一次通过
     * 执行用时:
     * 354 ms
     * , 在所有 Java 提交中击败了
     * 5.26%
     * 的用户
     * 内存消耗:
     * 42.6 MB
     * , 在所有 Java 提交中击败了
     * 98.29%
     * 的用户
     * 通过测试用例:
     * 361 / 361
     * @author keyi
     * @Date 2023/6/2 1:38
     * @param
     * @return
     */

    public static int removeDuplicates(int[] nums) {

        if(nums==null||nums.length==0){
            return 0;
        }
        int length = nums.length;

        for(int i=0;i<=length-2;i++){
            int j=i+1;
            while (j<length&&nums[i]==nums[j]){
            for(int k=j;k<length-1;k++){
                nums[k]=nums[k+1];
            }
            //找出一个重复的
             length--;
            }
                //因为nums是升序的,所以后面那个数如果大于前面那个数就结束这个循环
            if(nums[j]>nums[i]){
                    continue;
            }


        }

        return length;
    }
}

一.第一次可以运行的代码

时间复杂度 O(n的2次方)

空间复杂度 O(1)

二.需要注意的问题

1.需要排除异常情况、空指针

2.数组下标越界问题 注意数组的边界

三.leetcode官方题解及我的笔记

暴力解法:如果可以使用额外的空间,就直接把不重复的元素复制到新的的数组里。时间复杂度:O(n) 空间复杂度:O(n)

1.双指针

原地修改 模式识别

官方解法和我第一次解法的区别:官方是用到两个指针,慢指针,快指针,而我的解法用到了双层的循环,所以时间复杂度是0(n的2次方)。我的思路是从数组第一个也就是nums[0]开始遍历,从前往后找,而官方题解的思想是从第二个开始,从后往前(同时指针往后移动)。我的解法是遇到重复的就进行覆盖的操作,而官方题解巧妙之处在于是,遇到不重复的再操作

双指针中的“指针” 不仅仅是大家所熟知的C/C++里面的地址指针,还是索引、游标。

四.双指针算法的业务场景

(来自gpt)

  • 在一个日志文件中查找某个时间段内的数据(其实就是起始与结束的时间作为两个指针)
  • 给定两个有序数组,查找它们的交集或并集(具体思路是,定义两个指针分别指向两个数组的开头,然后比较两个指针所指向的元素大小,并根据大小关系移动指针。如果两个指针所指向的元素相同,则将其添加到结果集中。)
  • 在一个升序排列的链表中查找倒数第k个节点(具体思路是,定义两个指针pq,初始时都指向链表的头结点,并将其中一个指针向后移动k-1步,然后同时移动两个指针,直到第二个指针达到链表末尾位置。此时,第一个指针所指向的节点即为倒数第k个节点。)
  • 查找一个字符串中最长的无重复字符子串(查找一个字符串中最长的无重复字符子串,可以使用双指针算法来实现。具体思路是,定义两个指针leftright,分别表示子串的左右边界,并初始化为字符串的开头。然后移动右指针,直到遇到重复字符为止。此时,我们可以记录下当前子串的长度,并将左指针向右移动,直到遇到重复字符并删除该字符为止。这样,我们就得到了以右指针为结尾的最长无重复字符子串。根据这个方法,我们依次遍历整个字符串,每次更新最长无重复字符子串的长度即可。)
    public class LongestSubstring {
        public static int lengthOfLongestSubstring(String s) {
            if (s == null || s.length() == 0) {
                return 0;
            }
            int left = 0, right = 0;
            int maxLen = 0;
            Set<Character> set = new HashSet<>();
            while (right < s.length()) {
                if (!set.contains(s.charAt(right))) {
                    set.add(s.charAt(right));
                    right++;
                    maxLen = Math.max(maxLen, set.size());
                } else {
                    set.remove(s.charAt(left));
                    left++;
                }
            }
            return maxLen;
        }
        
        public static void main(String[] args) {
            String s = "abcabcbb";
            System.out.println(lengthOfLongestSubstring(s)); // 输出3
        }
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode笔记:26.删除排序数组中的重复项 的相关文章

随机推荐

  • 日常干货“杨辉三角”和“统计用户输入正整数中每个数字重复的次数并打印”

    目录 前言 使用java实现杨辉三角的输出 统计用户输入正整数中每个数字重复的次数并打印 前言 这些天一直在家 憋坏了 写了一些java的题目 为3月份的比赛做准备 下面的无法理解可设断点一个一个测 或者来问问我随时欢迎 使用java实现杨
  • 基于JDK1.8 的LinkedList源码分析

    基于JDK1 8 的LinkedList源码分析 代码注释 JDK版本 jdk1 8 0 181 package java util import java util function Consumer Doubly linked list
  • 数据挖掘相关的10个问题

    NO 1 Data Mining 和统计分析有什么不同 硬要去区分Data Mining和Statistics的差异其实是没有太大意义的 一般将之定义为Data Mining技术的CART CHAID或模糊计算等等理论方法 也都是由统计学者
  • Windows部署多个Memcached和Redis服务

    Windows部署多个Memcached和Redis服务 引言 1 部署多个Memcached服务 1 1 准备工作 1 2 创建服务 1 3 删除服务 2 部署多个Redis服务 2 1 准备工作 2 2 创建服务 2 3 卸载服务 总结
  • Linux高性能服务器编程|阅读笔记:第8章 - 高性能服务器程序框架

    目录 简介 系列笔记 8 1 服务器模型 8 1 1 C S模型 8 1 2 P2P模型 8 2 服务器编程框架 8 3 I O模型 8 4 两种高效的事件处理模式 8 4 1 Reactor模式 8 4 2 Proactor模式 8 5
  • 对存储过程进行加密和解密(SQL 2008/SQL 2012)

    开始 在网络上 看到有SQL Server 2000和SQL Server 2005 的存储过程加密和解密的方法 后来分析了其中的代码 发现它们的原理都是一样的 后来自己根据实际的应用环境 编写了两个存储过程 一个加密存储过程 sp Enc
  • 方法

    方法 方法定义 调用 方法完整的定义形式 方法的其他定义形式 方法使用的常见问题 方法案例 方法调用的内存图 方法的参数传递机制 方法的参数传递案例 方法重载 单独使用return关键字 1 方法概述 1 1 方法的概念 方法 method
  • 解决elementUI中el-select组件的选中不显示问题

    el select组件选中不显示的原因好像只出现在多级联动中 并且选中是有值的 只是单纯的不回显 可以在el select中加入change事件 然后使用vue的set方法将值重新修改进去
  • react修改node_modules里的文件

    一 node modules里的文件可以使用patch package来修改 安装patch package yarn add patch package 修改package json 新增命令postinstall scripts pos
  • 超详细maven的卸载、重新安装与配置

    一 maven的卸载 maven在使用时只是配置了环境变量和本地仓库 我们只需要删除本地仓库 在环境变量中移除maven的环境变量 1 删除解压的maven文件夹 在之前的安装中 我将本地仓库和maven解压后的文件放在同一个文件夹下 此时
  • Java 高级语法学习笔记(基础)

    目录 反射机制 Class 类 类初始化 类加载 类的生命周期 七大阶段 1 加载 接入 class文件 2 验证 连接 linking 的第一阶段 为了安全 3 准备 分配内存及初步初始化 4 解析 字符翻译成引用阶段 5 初始化 代码正
  • 某在线学习平台《数据挖掘》第六章课后习题

    本文章系本人结合讲义及网上学习资料整理 难免存在个别问题 仅供各位同学和爱好者参考和讨论 发现问题请各位码友留言勘误 谢谢 1 下列几种数据挖掘功能中被广泛的用于购物篮分析的是 AA 关联分析 B B 分类和预测 CC 聚类分析 DD 演变
  • AD Ldap pwdLastSet不能更新到指定日期

    由于网上资料实在有限 特此记录 The only values that can be set are 0 To set User Must Change Password at Next Logon set the pwdLastSet
  • JAVA--文档注释

    文档注释是如何生成 JDK中包含javadoc工具 可以将文档注释由源文件中生成一个HTML文档 方便记录程序信息 文档注释格式 由 开始 结束 其中 中内容以自由文本格式 开头 文档注释的位置 在描述的类 接口 方法 构造器 成员字段前面
  • 苹果macOS13Ventura更新体验:新功能带来的全新体验

    macOS 13 Ventura 是一款功能强大 界面美观的操作系统 它为用户提供了更好的使用体验 加强了与其他设备的互联互通 提高了隐私和安全性 无论是日常办公还是娱乐 macOS 13 Ventura 都能满足用户的需求 并带来更多的便
  • win10控制面板快捷键_Win10开启最强隐藏模式,电脑性能直线飙升

    电脑的处理器 显卡等重要配置不停的在辞旧迎新 更新换代 很多人为了追求更好的性能 也愿意花高价钱买高配置的电脑 要提升电脑性能 硬件设备必然是主导地位 但不是人人都这么富裕买得起的 按小高个人的理解不管设备多先进或多陈旧 能满足我们的需求够
  • python入门:浅谈python中的数据类型

    数据类型 数据类型 1 变量 2 字符串 1 字符串的命名规则 2 字符串的加法运算 3 整数 3 浮点数 4 type 函数 5 强制转换 数据类型 1 变量 先看下面的代码 print 我是最可爱的人 print 我是最可爱的人 pri
  • 微信支付, 小程序,公众号, 商户号 需要进行的配置

    目录 一 微信公众号 1 1 公众号基础信息配置 1 2 白名单配置 1 3 公众号开发人员配置 1 4 域名授权配置 1 5 服务器配置 二 微信小程序 2 1 开发设置 2 2 域名设置 2 3 开发者管理 2 4 版本管理 三 微信商
  • 移植QT到QNX,QNX开发QT程序,QT图形开发环境搭建

    锋影 e mail 174176320 qq com 根据QT主页上提供的参数 修改4个地方 configure opensource confirm license qpa iconv shared release xplatform b
  • leetcode笔记:26.删除排序数组中的重复项

    package com ko leetcode primaryAlgorithm array 初级算法 数组 1 删除排序数组中的重复项 Author ko Date 2023 6 1 23 55 Version 1 0 public cl