【Java 优选算法】双指针(上)

news2024/11/13 9:37:00

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



目录

移动零

分析

代码 

复写零

分析

代码 

快乐数

分析

代码 

盛最多水的容器

分析

代码 


移动零

题目链接

分析

双指针算法,利用两个指针cur和dest将数组划分为三个区间:

cur从0下标开始遍历,dest从-1开始 

两个指针的作用:

  • cur:从左到右遍历数组
  • dest:已处理的区间内,非零元素的最后一个位置 

cur从前往后遍历的过程中:

  1. 遇到0元素,cur++
  2. 遇到非0元素,交换dest+1和cur对应的元素,dest++,cur++ 

代码 

class Solution {
    public void moveZeroes(int[] nums) {
        for(int cur=0,dest = -1;cur < nums.length; cur++){
                    if(nums[cur] != 0){
                        int tmp=nums[cur];
                        nums[cur]=nums[dest+1];
                        nums[dest+1]=tmp;
                        dest++;
                    }
                }
    }
}

复写零

题目链接

分析

使用双指针算法,定义两个数组下标变量cur和dest,

  • cur 来判断元素是否为0
  • dest用来复写

因为题目要求的是 就地 复写,如果从左往右复写是不行的(复写的0会覆盖掉后面的非0值)

该题要采取从后往前的复写,以下是解题步骤

  1. 先找到最后一个要复写的数
    1. 先判断cur位置的值
    2. 决定dest相后移动一步(非0时)或者两步(0时)
    3. 判断一下dest是否已经到结束位置
    4. cur++
  2. 再从后往前进行复写

下图演示的是如何 寻找最后一个复写位置,其中n为数组长度

处理一下特殊情况,当通过上述逻辑时可能最后出现下图中的情况:

cur的位置没有问题,但dest的位置越界了

处理办法:

  1. 直接将n-1位置修改为0
  2. cur--
  3. dest -=2

代码 

class Solution {
    public void duplicateZeros(int[] arr) {
        int cur=0, dest=-1,n=arr.length;
        //1.找最后一个复写位置
        while(cur<n){
            if(arr[cur]!=0){
                dest++;
            }else{
                dest+=2;
            }
            if(dest>=n-1) break;
            cur++;
        }
        //1.5处理边界情况
        if(dest==n){
            arr[n-1]=0;
            dest-=2;
            cur--;
        }
        //2.从后往前开始复写
        while(cur>=0){
            if(arr[cur]!=0){
                arr[dest--]=arr[cur--];
            }else{
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }
        }
    }
}

快乐数

题目链接

分析

分析题目得出 计算每位数的和相加一共有两种情况:

  1. 最后结果为1 成环
  2. 最后结果不为1 成环

这就和 判断链表是否有环的题 解法类似, 采用快慢指针法

  1. 定义快慢'指针'(这里的'指针' 代表 是计算的值)
  2. 慢指针每次向后'移动'一步,快指针每次向后移动两步(这里的'移动几步' 代表 计算n的每位数的和 的次数)
  3. 判断相遇时的值

代码 

class Solution {
    //计算每位数的和
    public int bitSum(int n){
        int sum=0;
        while(n!=0){
            int m=n%10;
            sum+=m*m;
            n /=10;
        }
        return sum;
    }

    public boolean isHappy(int n) {
        int slow=n,fast=bitSum(n);
        while(slow!=fast){
            slow=bitSum(slow);
            fast=bitSum(bitSum(fast));
        }
        if(slow==1){
            return true;
        }else{
            return false;
        }
    }
}

盛最多水的容器

题目链接

分析

容水量=两边高度的最小值 * 宽度

解法1:暴力枚举,将所有可能的值 都列举出来,求最大值--->结果会超时,时间复杂度为O(n^2)

解法2:利用单调性,使用双指针来解决--->时间复杂度为O(n)

步骤:

  1. 定义两个指针 left和right,left从左到右,right从右到左遍历数组
  2. left和right对于元素小的移动一位(left小,left++;right小,right--),当left和right相遇,循环结束
  3. 记录每次计算的容水量 v1,v2,v3...
  4. 对容水量取最大值

代码 

class Solution {
    public int maxArea(int[] height) {
        int ret=0,left=0,right=height.length-1;
        while(left<right){
            int v=Math.min(height[right],height[left])*(right-left);
            ret=Math.max(ret,v);
            if(height[left]<height[right]) left++;
            else right--;
        }
        return ret;
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java题集综合实践——简易计算器制作

此系列文章收录大量Java经典代码题&#xff08;也可以算是leetcode刷题指南&#xff09;&#xff0c;剩余文章指路Java题集。希望可以与大家一起探索Java的神秘。3、2、1&#xff0c;请看&#xff01; 本篇文章将带大家编写一个简易算术计算器。 功能&#xff1a;将几个算术功…

VBA经典应用69例应用6:格式化代码中的双引号(””)和井号(#)

《VBA经典应用69例》&#xff08;版权10178981&#xff09;&#xff0c;是我推出的第九套教程&#xff0c;教程是专门针对初级、中级学员在学习VBA过程中可能遇到的案例展开&#xff0c;这套教程案例众多&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以便…

使用java做一个微信机器人

如何使用Java开发微信机器人 在当今社交网络盛行的时代&#xff0c;微信已成为人们生活中不可或缺的工具。为了更好地服务用户&#xff0c;许多企业和个人开始利用微信机器人来自动化回复消息、发布信息等操作。本文将介绍如何使用Java开发一个简单的微信机器人&#xff0c;并…

html基础语法 看这一篇就够了!

HTML 一 概念 html:html 文件根标签 head:编写页面相关的属性 title:页面标题 body:页面内容展示信息 二 DOM 树&#xff1a; 所有的标签都是 html 的子标签 head 和 body 是兄弟标签&#xff0c;同一级别 head 和 title 为父子标签 1.第一个程序 <html><head>…

音视频入门基础:WAV专题(9)——FFmpeg源码中计算WAV音频文件每个packet的duration和duration_time的实现

一、引言 从文章《音视频入门基础&#xff1a;WAV专题&#xff08;6&#xff09;——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道&#xff0c;通过FFprobe命令可以显示WAV音频文件每个packet&#xff08;也称为数据包或多媒体包&#xff09;的信息&#xff0…

苹果电脑可以玩《原神》吗?原神可以在Mac上玩吗?苹果电脑玩原神怎么样

《原神》是一款由米哈游开发的开放世界冒险游戏&#xff0c;自从2020年正式上线以来&#xff0c;就受到了全球玩家的热烈欢迎。《原神》的画面精美&#xff0c;音乐动听&#xff0c;剧情丰富&#xff0c;角色多样&#xff0c;玩法多变&#xff0c;让人沉浸在一个充满奇幻和魅力…

【Python 学习】Pandas基础与应用(1)

题目 1 Pandas 简介1.1 主要特征1.2 Pandas 安装 2 Pandas中的数据结构2.1 Series 数据结构和操作2.1.1 Series的数据结构2.1.2 Seres的操作 2.2 DataFrame 数据结构和操作2.2.1 DataFrame 数据结构2.2.2 Dataframe 操作2.2.3 DateFrame 的特殊操作 2.3 Series 和 DataFrame 的…

LRU go cache的实现

目录 LRU算法LRU原理LRU实现Redis LRU算法实现1. 内存淘汰策略2. LRU算法的实现3. LRU vs LFURedis中的LRU使用场景 基于LRU的缓存库go-cache安装使用代码解析 hashicorp/golang-lru安装使用代码解析 groupcache安装使用代码解析缓存淘汰算法并发缓存组一致性哈希防止缓存击穿—…

从电商行业的变化引出未来技术趋势

时间&#xff1a;2024年09月08日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 音频地址&#xff1a;喜马拉雅 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋推荐一下&#xff0c;小蒋希望遇到一个认真…

无人机人工增雨技术详解

无人机&#xff0c;全称为无人驾驶飞行器&#xff08;Unmanned Aerial Vehicle, UAV&#xff09;&#xff0c;是一种不需要人员直接操控&#xff0c;而是利用先进的遥控技术、自主飞行控制系统和传感器技术来实现空中飞行和完成特定任务的飞行器。 一、技术原理 无人机人工增雨…

轻NAS系统CasaOS设备安装Memos笔记结合内网穿透公网访问与同步教程

文章目录 前言1. 使用Docker部署memos2. 注册账号与简单操作演示3. 安装cpolar内网穿透4. 创建公网地址5. 创建固定公网地址 前言 本文主要介绍如何在安装了轻NAS系统CasaOS设备中使用Docker本地部署开源云笔记服务memos&#xff0c;并结合cpolar内网穿透工具配置公网地址&…

C/C++两点坐标求距离以及C++保留两位小数输出,秒了

目录 1. 前言 2. 正文 2.1 问题 2.2 解决办法 2.2.1 思路 2.2.2 代码实现 3. 备注 1. 前言 依旧是带来一个练手的题目&#xff0c;目的就一个&#xff0c;方法千千万&#xff0c;通向终点的方式有很多种&#xff0c;没有谁与谁&#xff0c;我们都是为了成为更好的自己。…

VMware Fusion 虚拟机Mac版 安装CentOS系统教程

Mac分享吧 文章目录 CentOS安装完成&#xff0c;软件打开效果一、Mac中使用虚拟机安装CentOS系统1️⃣&#xff1a;下载镜像2️⃣&#xff1a;创建虚拟机3️⃣&#xff1a;设置虚拟机4️⃣&#xff1a;安装虚拟机5️⃣&#xff1a;设置成从磁盘启动 安装完成&#xff01;&…

哈希表如何避免冲突

系列文章&#xff1a; 1. 先导片--Map&Set之二叉搜索树 2. Map&Set之相关概念 3. 哈希表如何避免冲突 目录 1.概念 2. 冲突-概念 3. 冲突-避免 3.1 冲突-避免-哈希函数设计 3.2 冲突-避免-负载因子调节 4. 冲突-解决 4.1 冲突-解决-闭散列 4.1.1 线性探…

C++_15_类与对象

类与对象 什么是类&#xff1f; 描述有共同特征的事务的概念 作用&#xff1a;代码中 创建对象 什么是对象&#xff1f; 生活中&#xff1a; 就是指真实存在的事物。 代码中&#xff1a; 模拟真实的事物&#xff0c;使用类创建得到。 类与对象的关系 生活中&#xff1a; ​ 先…

VMware vSphere5.0关闭虚拟机电源时,报错从ESXI主机接收到错误

ESXI和VCENTER都是5.0版本的&#xff0c;有台虚拟机关机报错提示从ESXI主机接受到意外错误 具体报错信息如下&#xff1a; 从VCENTER平台对该虚拟机做任何操作都无法生效&#xff0c;后来查看了虚拟机的网络和端口&#xff0c;发现SSH能正常联通&#xff0c;进入虚拟机后使用命…

【算法专场】模拟(下)

目录 前言 38. 外观数列 算法分析 算法思路 算法代码 1419. 数青蛙 算法分析 算法思路 算法代码 2671. 频率跟踪器 算法分析 算法思路 算法代码 前言 在前面我们已经讲解了什么是模拟算法&#xff0c;这篇主要是讲解在leetcode上遇到的一些模拟题目~ 38. 外观数列…

Pencils Protocol生态新进展,即将上线 Vault 产品

“极高的盈利预期、通证的持续回购与销毁&#xff0c;Vault产品的推出正在成为Pencils Protocol生态发展的重磅利好。” Pencils Protocol是目前Scroll生态TVL最高的DeFi平台 &#xff0c;即便是行情整体较为平淡&#xff0c;其仍旧能够保持在3亿美元左右的锁仓价值&#xff0c…

史上最全的Linux常用命令汇总(超全面!超详细!)收藏这一篇就够了!

command &#xff1a;命令名&#xff0c;相应功能的英文单词或单词的缩写[-options] &#xff1a;选项&#xff0c;可用来对命令进行控制&#xff0c;也可以省略parameter &#xff1a;传给命令的参数&#xff0c;可以是 零个、一个 或者 多个 查阅命令帮助信息 -help 说明&…

LC1860C 后来怎么样了

这块芯片前身是大唐旗下联芯的LC1860C&#xff1b;这块传奇芯片在4G时代大放异彩&#xff0c;但是某些原因之后&#xff0c;技术打包转让给三家&#xff0c;分别是&#xff1a;小米&#xff0c;大疆&#xff0c;哲酷&#xff08;VIVO&#xff09;&#xff1b; 1、哲酷 哲酷目…