【LeetCode】一、数组相关(双指针算法 + 置换)

文章目录

  • 1、算法复杂度
    • 1.1 时间复杂度
    • 1.2 空间复杂度
  • 2、数组
  • 3、leetcode485:最大连续1的个数
  • 4、leetcode283:移动0
  • 5、leetcode27:移除元素

1、算法复杂度

1.1 时间复杂度

算法的执行时间与输入值之间的关系(看代码实际总行数的变化) ⇒ 常对幂指阶

在这里插入图片描述

1.2 空间复杂度

算法存储空间与输入值之间的关系(看变量的数量或者对象的数量)

在这里插入图片描述

2、数组

数组特点:

  • 所占的内存空间连续
  • 存储的元素类型相同

访问、搜索、插入、删除的时间复杂度:

在这里插入图片描述

访问时,时间复杂度为O(1)

a[i] = a[0]地址 + i * 元素类型所占字节

搜索时,需要遍历,直到找到a[i]的值等于所查的value,复杂度为O(n),插入和删除时,最坏的情况在数组的开头进行增删,后面的元素都得后退或者前移一格,或者说插入引起了数组的copy到扩容后的新数组,则也是O(n)

在这里插入图片描述

3、leetcode485:最大连续1的个数

在这里插入图片描述
思路:遍历数组,出现一个1就把计数 +1,出现一个0则计数置为0,置为0之前存一下当前的计数值

public class P485 {

    public static void main(String[] args) {
        int[] array = {1, 0, 1, 1, 0, 1, 1, 1, 0, 1};
        System.out.println(column(array));
    }

    public static int column(int[] array) {
        if (null == array || array.length == 0) {
            return 0;
        }
        int result = 0;
        // 被出现的0打断计数后,存下目前的最大计数值
        int resultTemp = 0;
        for (int i : array) {
            if (i == 1) {
                result = result + 1;
            }
            if (i == 0) {
                resultTemp = Math.max(result, resultTemp);
                // 置为0,重新计数
                result = 0;
            }
        }
        return Math.max(result, resultTemp);
    }
}

测试:

在这里插入图片描述

4、leetcode283:移动0

在这里插入图片描述

一开始想的是:遍历找为0的元素,找到一个就将其后面的所有元素往前移动一位,然后将这个为0的元素自身扔在数组末尾。操作次数太多。

转向考虑找非0的,找到第一个,就将其放到index = 0 的位置,并且index计数加一,准备等下一个非0的元素,依次往后放非0元素,遍历完后,index后面剩下的空位都补0即可。

public class P283 {
    public static void main(String[] args) {
        int[] array = {1, 0, 9, 0, 6, 8, 0};
        for (int i : move(array)) {
            System.out.print(i + ",");
        }
    }

    public static int[] move(int[] array) {
        // 记录非0元素下标位置(像一个指针,告诉我目前非0元素放到几号空位了)
        int index = 0;
        for (int i = 0; i < array.length; i++) {
            if (array[i] != 0) {
                // 非0元素前移
                array[index] = array[i];
                index++;
            }
        }
        // 剩余空位全部为0
        for (; index < array.length ; index++) {
            array[index] = 0;
        }
        return array;
    }
}

在这里插入图片描述

5、leetcode27:移除元素

在这里插入图片描述

思路:双指针算法 + 置换

在这里插入图片描述
左右两个指针,L指针向右找等于要移除的val的位置停下来,R指针向左找不等于val的位置停下来,然后两个位置的元素置换。如此,右边的就全是要移除的值,左边的数量即为该题的返回值。

当左指针L >= 右指针R时,说明已经全部遍历了一遍了,此时,看下,如果L所在的值为val,说明其前面全都是不等于val的值,比如L为4,说明当前位置下标为4,前面为0、1、2、3这四个元素,返回的数量就是4,也即L的值,反之,L所在的值不等于val,说明当前位置的值及其前面的值,都是不等于val的值,数量 = 索引 + 1,返回L + 1

public class P27 {
    public static void main(String[] args) {
        int[] array = {1, 0, 9, 0, 6};
        System.out.println(remove(array, 0));
    }

    public static int remove(int[] array, int val) {
        if (array == null || array.length == 0) {
            return 0;
        }
        int left = 0;
        int right = array.length - 1;
        while (left < right) {
            // 没找到左边等于val的值前,一直找
            while (left < right && array[left] != val) {
                left++;
            }
            // 没找到右边不等于val的值前,一直找
            while (left < right && array[right] == val) {
                right--;
            }
            // 置换,把数组中等于value的元素扔右边
            int temp = array[left];
            array[left] = array[right];
            array[right] = temp;

        }

        if (array[left] == val) {
            return left;
        } else {
            return left + 1;
        }

    }
}

测试:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/744329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 5.7.42 主从复制环境搭建

MySQL 5.7.42 主从复制环境搭建 下载MySQL二进制包操作系统环境配置安装过程搭建从库 本次安装环境&#xff1a; OS版本&#xff1a;Red Hat Enterprise Linux Server release 6.8 (Santiago) MySQL版本&#xff1a;5.7.42 架构&#xff1a;同一台机器&#xff0c;多实例安装搭…

洁净室(区)浮游菌检测标准操作规程及GB/T 16292-2010测试方法解读

洁净室(区)空气中浮游菌的检测。洁净区浮游菌检测是一种评估和控制洁净区(如实验室、生产车间等)内空气质量的方法。这种检测的目的是通过测量空气中的微生物(即浮游菌)数量&#xff0c;来评估洁净区的清洁度或污染程度。下面中邦兴业小编带大家详细看下如何进行浮游菌采样检测…

TSLANet:时间序列模型的新构思

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…

Python --- 如何修改Jupyter Notebook保存文件的路径?

如何修改Jupyter Notebook在本地保存文件的默认路径&#xff1f; 一直以来都比较喜欢jupter notebook&#xff0c;自从用了以后就爱上了。平时用的时候&#xff0c;因为大多都是临时调用&#xff0c;每次在界面里直接new一个新的file就开干。 曾经也想过我创建的这些python文件…

Android开发系列(十)Jetpack Compose之Card

Card是一种常用的UI组件&#xff0c;用于显示一个具有卡片样式的容器。Card组件通常用于显示列表项、卡片式布局或任何需要显示边框和阴影的UI元素。 使用Card组件&#xff0c;您可以轻松地创建带有卡片效果的UI元素。以下是一些Card组件的常见属性和功能&#xff1a; elevati…

微软专家分享 | AIGC开发者沙龙上海站来啦!

为了向技术开发者、业务人员、高校学生、以及个体创业人员等AI技术关注者们提供更深入的行业洞察、技术交流平台和创新思维的启发&#xff0c;AIGC开放社区联合微软Reactor特别组织了一系列城市巡回沙龙分享活动。在上海站中&#xff0c;我们有幸邀请到多位微软专家进行深入的主…

操作系统实训复习笔记(第7关:生产者消费者问题实践)

目录 第7关&#xff1a;生产者消费者问题实践 第1关&#xff1a;生产者消费者问题实践 1、在主线程中初始化锁为解锁状态 2、访问对象时的加锁操作与解锁操作 3、&#xff08;生产和消费进程操作后&#xff09;信号量操作实现进程同步 4、先等待&#xff08;生产还是消费…

数字孪生为何在智慧工业中备受青睐

数字孪生在智慧工业中为何愈发受到重视&#xff1f;随着工业4.0时代的到来&#xff0c;制造业正经历着前所未有的变革。数字孪生技术作为一项革新性的科技手段&#xff0c;通过构建物理实体的数字化复制品&#xff0c;为工业生产、管理和优化提供了全新的方法和视角。其独特的优…

使用Servlet开发javaweb,请求常见错误详解及其解决办法【404、405、500】

Servlet报错的情况多种多样&#xff0c;涵盖了配置错误、代码逻辑错误、资源未找到、权限问题等多个方面。以下是一些常见的Servlet报错情况及其可能的原因和解决方法&#xff1a; 404 Not Found: 错误原因图示&#xff1a; URL映射 发送请求&#xff0c;出现404错误 原因: 请…

窗口控制

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 海龟绘图窗口就是在运行了导入turtle模块并调用了绘图方法的Python文件后&#xff0c;打开的窗口。该窗口默认的宽度为屏幕的50%&#xff0c;高度为屏…

力扣62 不同路径

一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 问总共有多少条不同的路径&#xff1f; 输入&…

基于肤色模型的人脸识别,基于野火FPGA ZYNQ开发板

使用芯片为ZYNQ—7020&#xff0c;基于野火FPGA ZYNQ开发板 肤色模型简介 YCrCb也称为YUV&#xff0c;主要用于优化彩色视频信号的传输。与RGB视频信号传输相比&#xff0c;它最大的优点在于只需占用极少的频宽&#xff08;RGB要求三个独立的视频信号同时传输&#xff09;。其…

【博士每天一篇文献-算法】Fearnet Brain-inspired model for incremental learning

阅读时间&#xff1a;2023-12-16 1 介绍 年份&#xff1a;2017 作者&#xff1a;Ronald Kemker&#xff0c;美国太空部队&#xff1b;Christopher Kanan&#xff0c;罗切斯特大学 期刊&#xff1a; arXiv preprint 引用量&#xff1a;520 Kemker R, Kanan C. Fearnet: Brain-…

大学生必备!GitHub星标破千的matlab教程(从新手到骨灰级玩家)

MATLAB&#xff08;Matrix Laboratory&#xff09;是MathWorks公司推出的用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境的商业数学软件。 MATLAB具有数值分析、数值和符号计算、工程与科学绘图、数字图像处理、财务与金融工程等功能&#xf…

速卖通自养号测评:安全高效的推广手段

在速卖通平台上&#xff0c;卖家们常常寻求各种方法来提升商品的曝光、转化率和店铺权重。其中&#xff0c;自养号测评作为一种低成本、高回报的推广方式&#xff0c;备受关注。然而&#xff0c;若操作不当&#xff0c;也可能带来风险。以下是如何安全有效地进行自养号测评的指…

这就是人性的丑恶,很残酷但很现实

这些年我喜欢跟垃圾撕破脸&#xff0c;包括垃圾亲戚&#xff0c;我是不会跟你讲什么感情的&#xff0c;该滚蛋就滚蛋。我最不喜欢听什么今日留一线&#xff0c;日后好相见。 之前我还不懂事的时候&#xff0c;就有那种亲戚叫我帮他介绍工作&#xff0c;我照做了。 结果&#xf…

Jenkins定时构建自动化(五):手动+定时构建执行本地+运行代码需要传参

Jenkins定时构建自动化(五)&#xff1a;手动定时构建执行本地运行代码需要传参 注&#xff1a;走到这一步&#xff0c;恭喜你学会了基本的jenkins代码执行&#xff0c;如果想要继续学习先去看python的argparse模块和argparse模块示例&#xff0c;也可以直接看argparse模块示例进…

React@16.x(40)路由v5.x(5)常见应用场景(2)- 实现类似 vue 的路由模式

目录 1&#xff0c;vue-router2&#xff0c;React 模拟实现 1&#xff0c;vue-router vue 的路由配置文件&#xff0c; // src/router/index.ts const routes [{path: "/news",children: [{ path: "", component: NewsView },{ path: "detail"…

免费领!系统学习上位机编程的流程与基础教程

上位机电气自动化plc编程全套入门教程工具 华山编程导师根据当前招聘需求的关键点&#xff0c;原创录制了一套系统的学习流程和基础教程&#xff0c;帮助你从快速入门到掌握上位机编程的技能。 二. 学习准备 为了更好地学习并实现80%以上的代码运行&#xff0c;建议准备一个工…

大学生搜题神器网站?分享七个支持答案和解析的工具 #职场发展#学习方法

在现代科技的帮助下&#xff0c;大学生们有幸能够利用各种日常学习工具来提升自己的学习效果。 1.全球翻译官 是一款在线翻译语言的服务平台&#xff0c;在app中&#xff0c;用户能够在线通过语音,拍照来翻译语言&#xff0c;非常的便捷&#xff0c;也支持文字翻译哦 全球翻…