双指针问题(Java编写)

news2024/11/18 23:36:19

日升时奋斗,日落时自省 

目录

一、移动零

二、盛水最多的容器

三、快乐数

四、复写零

五、三数之和

六、有效三角形的个数

七、四数之和


一、移动零

题目来源:. - 力扣(LeetCode)

题目主要内容就是将数组中所有的零移动到最左边

使用快慢指针方法进行处理

代码: 

    public void moveZeroes(int[] nums) {
        for(int cur=0;dest=-1;cur<nums.length;cur++){
            if(nums[cur]!=0){
                //在判定当前值不等于 0 dest就可以进行加加
                dest++;
                //进行值的替换
                int tmp = nums[cur];
                nums[cur]=nums[dest];
                nums[dest]=tmp;
            }
        }
    }

二、盛水最多的容器

题目来源:. - 力扣(LeetCode)

题目主要内容横坐标的差值为长度,纵坐标的两个最小值为宽度,就散长方形的面积最大

代码:

    public int maxArea(int[] height) {
        int left = 0 , right = height.length-1 ,ret=0;
        while(left<right){
            //计算面积
            int v = Math.min(height[left],height[right])*(right-left);
            //取最大值
            ret= Math.max(ret,v);
            //进行位置调节
            if(height[left]<height[right]){
                left++;
            }else{
                right--;
            }
        }
        return ret;
    }

三、快乐数

题目来源:. - 力扣(LeetCode)

题目主要内容重复每个位的数进行平方相加==0为快乐数

代码:

    //计算数值个位的平方和
    public int bigSum(int t){
        int sum=0;
        while(t>0){
            int tmp= t%10;
            sum+=tmp*tmp;
            t/=10;
        }
        return sum;
    }
    public boolean isHappy(int n) {
        //第一个和第二个不同
        int slow = n, fast = bigSum(n);
        while(slow!=fast){
            //走一步
            slow=bigSum(slow);
            //快指针走两步
            fast=bigSum(bigSum(fast));
        }
        return slow==1;
    }

四、复写零

题目来源:. - 力扣(LeetCode)

题目主要内容每次遇到0就复写一次,后面数值向后移动,末尾数值因为数组大小不变就消失了

上图没有画完,一次类推可以得出结果

注:那当前假设的位置怎么找,这里再配一张图解释

边界情况:

 

代码:

    public void duplicateZeros(int[] nums) {
        int cur= 0 , dest = -1 , n=nums.length;
        //先去找假设值
        while(cur<n){
            if(nums[cur]!=0){
                dest++;
            }else{
                dest+=2;
            }        
            if(dest>=n-1)break;
            cur++;
        }
        //越界判断
        if(dest==n){
            nums[n-1]=0;
            cur--;
            dest-=2;
        }
        //复写零
        while(cur>0){
            if(nums[cur]!=0){
                nums[dest--]=nums[cur--];
            }else{
                nums[dest--]=0;
                nums[dest--]=0;
                cur--;
            }
        }
    }

五、三数之和

题目来源:. - 力扣(LeetCode)

题目主要内容数组中任意三个数和等于target记录下来即可

暴力解法:三个for循环进行遍历就可以解决,当然时间复杂度太高

题解思路:

因为给的数组是无序的,要是使用双指针的话不确定因素太多(就是控制不了数值总和的大小)

首先给数组排个序Java调用库函数就可以排序了

代码:

    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ret=new ArrayList<>();
        //进行排序
        Arrays.sort(nums);
        int n=nums.length;
        for(int i=0;i<n;){
            if(nums[i]>0)break;
            int left = i + 1;
            int right = n-1;
            
            while(left<right){
                //求和
                int sum = nums[i]+nums[left]+nums[right];
                //小于说明left值太小 向后取更大的
                if(sum<0){
                    left++;
                //大于说明right值太大 向前取更小的
                }else if(sum>0){
                    right--;
                }else{
                    //等于就添加进集合中  同时跳过两个位置
                    ret.add(new ArrayList<>(Arrays.asList(nums[i],nums[left],nums[right])));
                    right--;
                    left++;
                    //左去重 
                    while(left<right&&nums[left]==nums[left-1]){
                        left++;
                    }
                    //右去重
                    while(left<right&&nums[right]==nums[right+1]){
                        right--;
                    }
                }
            }
            i++;
            //第一个数去重
            while(i<n&&nums[i]==nums[i-1]){
                i++;
            }
        }
        return ret;
    }

六、有效三角形的个数

题目来源:. - 力扣(LeetCode)

题目主要内容计算有效三角形的个数

三角形满足两小边之和大于第三边

如何知道那两个边是小的 ,这里就可以进行排序使用双指针解决问题

最大边就是右边的值

代码:

    public int triangleNumber(int[] nums) {
        if(nums.length<3){
            return 0;
        }
        Arrays.sort(nums);
        int ret=0;
        for(int i=nums.length-1;i>=2;i--){
            int left = 0, right =i-1;
            int maxnum=nums[i];
            //双指针移动
            while(left<right){
                if(nums[left]+nums[right]>maxnum){
                        //可以跳过当前值
                        ret+=right-left;
                        right--;
                    }else{
                        //如果针对以上的不满足的 说明值是太小的,left进行++
                        left++;
                    }
                }
            }
        return ret;
    }

七、四数之和

题目来源:. - 力扣(LeetCode)

题目主要内容类似与三数之和,多嵌套一层for循环进行计算,就是固定两个数字不变其他的两个数字称为双指针进行移动

代码:

    public List<List<Integer>> fourSum(int[] nums, int target) {
        if(nums.length<4){
           return new ArrayList<>();
        }
        List<List<Integer>> ret=new ArrayList<>();
        int n=nums.length;
        //进行排序 为了 双指针 在计算的时候可以决定总和的大小
        Arrays.sort(nums);
        for(int i=0;i<n;){
            for(int j=i+1;j<n;){
                int left = j+1;
                int right = n-1;
                while(left<right){
                    if(nums[i]+nums[j]+nums[left]+nums[right]<target){
                        left++;
                    }else if(nums[i]+nums[j]+nums[left]+nums[right]>target){
                        right--;
                    }else{
                        ret.add(new ArrayList<>(Arrays.asList(nums[i],nums[j],nums[left],nums[right])));
                        left++;
                        right--;
                        //双指针去重
                        while(left<right&&nums[left]==nums[left-1]){
                            left++;
                        }
                        while(left<right&&nums[right]==nums[right+1]){
                            right--;
                        }
                    }
                }
                //第二个数字的去重
                j++;
                while(j<n&&nums[j]==nums[j-1]){
                    j++;
                }
            }
            //第一个数字的去重
            i++;
            while(i<n&&nums[i]==nums[i-1]){
                i++;
            }
        }
        return ret;
    }

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

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

相关文章

解决VSCode 不能拖拽文件问题

给【以管理员身份运行次程序】关掉&#xff0c;不要打勾 至于为什么开启了管理员就不能拖拽了&#xff0c;我也不知道&#xff0c;我猜的&#xff1a; 这可能是因为在VSCode中&#xff0c;管理员权限可能会限制用户对文件的操作权限。管理员权限对于一些操作可能会有更严格的限…

【Vue3】全局组件,递归组件,动态组件,传送组件,缓存组件,异步组件等

组件使用 父子组件传参父传子模板上直接使用js里面使用ts组件里面泛型接收ts泛型里面设置默认值 子传父方式一&#xff0c;采用defineEmits方式二&#xff0c;采用ts的泛型 方式三&#xff0c;采用ref获取子组件内部暴露的数据和方法子组件先暴露父组件接收 全局组件发现有报错…

云原生精品资料合集(附下载)

云计算是产业数字化转型的关键基础设施,以基础设施资源为中心的云搬迁时代接近尾声&#xff0c;以应用价值为中心的云原生时代已经到&#xff0c;所以IT人员学习云原生正当时&#xff01;最近跟各位大神征集了云原生的教程&#xff0c;行业报告和最佳实践&#xff0c;总有一款适…

【软考】UML中的图之通信图

目录 1. 说明2. 图示3. 特性4. 例题4.1 例题1 1. 说明 1.通信图强调收发消息的对象的结构组织2.早期版本叫做协作图3.通信图强调参加交互的对象和组织4.首先将参加交互的对象作为图的顶点&#xff0c;然后把连接这些对象的链表示为图的弧&#xff0c;最后用对象发送和接收的消…

『Linux从入门到精通』第 ㉑ 期 - 文件系统详解

文章目录 &#x1f490;专栏导读&#x1f490;文章导读&#x1f427;认识磁盘&#x1f427;逻辑抽象&#x1f427;文件系统&#x1f426;Block&#x1f426;Block Group&#x1f414;Block Group 的组成部分 &#x1f426;Superblock(超级区块)&#x1f426;Group Description(…

FRM模型十二:极值理论

目录 极值理论介绍GEVPOT 代码实现 极值理论介绍 在风险管理中&#xff0c;将事件分为高频高损、高频低损、低频高损、低频低损。其中低频高损是一种非常棘手的损失事件&#xff0c;常出现在市场大跌、金融体系崩溃、金融危机以及自然灾害等事件中。 由于很难给极端事件一个准…

如何解决局域网tcp延迟高来进行安全快速内外网传输呢?

在当今企业运营中&#xff0c;数据的快速流通变得至关重要&#xff0c;但局域网内的TCP延迟问题却成为了数据传输的障碍。本文旨在分析局域网TCP延迟的成因&#xff0c;并探讨几种企业数据传输的常见模式&#xff0c;以及如何为企业选择合适的传输策略&#xff0c;以确保数据在…

简单求和计算器

其实对于计算器的写法在C语言阶段就已经有了&#xff0c;但是&#xff0c;在目前阶段《前后端交互》&#xff0c;这算是一种全新的写法&#xff0c;毕竟将数据从前端返回给后端&#xff0c;然后再将数据返回给前端&#xff0c;都涉及到一些参数的交互&#xff0c;值得我们学习深…

[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解

一、分析判断 进入靶机&#xff0c;主页面如图&#xff1a; 主页面提供给我们一条关键信息&#xff1a; flag值在 表flag 中的 flag列 中。 接着我们尝试输入不同的id&#xff0c;情况分别如图&#xff1a; 当id1时&#xff1a; 当id2时&#xff1a; 当id3时&#xff1a; 我…

博弈论---Nim游戏(公平组合游戏,概念,证明异或为0就是必败态,示例)

目录 概念&#xff1a; 公平组合游戏ICG 有向图游戏 Nim游戏 先手&#xff09;必胜状态 先手&#xff09;必败状态 如何确定先手是否必胜或者必败&#xff08;都采用最优策略&#xff09; 证明&#xff1a;全部异或为0则是必败状态 综上&#xff1a; 例子 概念&#…

OJ_二叉树已知先序遍历序列(有空叶子)求中序遍历序列

题干 C实现 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<vector> using namespace std;struct TreeNode {char data;TreeNode* left;TreeNode* right; };TreeNode* RecursiveBuildTree(int& i, char str[]) {char c str[i];i;if (c #) {re…

红队基础设施建设

文章目录 一、ATT&CK二、T1583 获取基础架构2.1 匿名网络2.2 专用设备2.3 渗透测试虚拟机 三、T1588.002 C23.1 开源/商用 C23.1.1 C2 调研SliverSliver 对比 CS 3.1.2 CS Beacon流量分析流量规避免杀上线 3.1.3 C2 魔改3.1.4 C2 隐匿3.1.5 C2 准入应用场景安装配置说明工具…

【开源】JAVA+Vue.js实现桃花峪滑雪场租赁系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设计3.1 教练表3.2 教练聘请表3.3 押金规则表3.4 器材表3.5 滑雪场表3.7 售票表3.8 器材损坏表 四、系统展示五、核心代码5.1 查询教练5.2 教练聘请5.3 查询滑雪场5.4 滑雪场预定5.5 新…

掌握Python操作Word:从基础到高级全覆盖

掌握Python操作Word&#xff1a;从基础到高级全覆盖 引言Python操作Word的基础文档的创建与打开文档的基本操作 创建和打开Word文档创建新的Word文档打开现有文档读取文档内容修改现有文档 编辑文档内容添加和编辑文本设置格式插入标题 处理文档结构操作段落列表的处理表格的操…

Linux Shell脚本练习(三)

1、测试用户名与密码是否正确。 2、输出1-1000内的素数。 3、对 100 以内的所有正整数相加求和(1234...100)。 4、输出9*9 乘法表。 5、编写脚本,显示进度条。 、 6、输入三个数并进行升序排序

Linux-nginx服务

一.Nginx概述 1.定义 一款高新能、轻量级Web服务软件 系统资源消耗低 对HTTP并发连接的处理能力高 单台物理服务器可支持30 000&#xff5e;50 000个并发请求。 2.Nginx模块作用 &#xff08;1&#xff09;main模块 全局配置模块&#xff0c;所有模块都要执行遵守&#xf…

Mac 制作可引导安装器

Mac 使用U盘或移动固态硬盘制作可引导安装器&#xff08;以 Monterey 为例&#xff09; 本教程参考 Apple 官网相关教程 创建可引导 Mac OS 安装器 重新安装 Mac OS 相关名词解释 磁盘分区会将其划分为多个单独的部分&#xff0c;称为分区。分区也称为容器&#xff0c;不同容器…

前端 JS 经典:Content-type 详解

1. 什么是 Content-Type Content-Type 是 HTTP 协议中的一个请求头或响应头字段&#xff0c;用于指示发送或接收的实体的媒体类型&#xff0c;告诉服务器或客户端如何解析和处理请求或响应的主体部分。 2. Content-Type 的构成 Content-Type 由两部分组成&#xff1a;媒体类型…

大数据可视化python01

import pandas as pd import matplotlib.pyplot as plt# 设置中文改写字体 plt.rcParams[font.sans-serif] [SimHei]# 读取数据 data pd.read_csv(C:/Users/wzf/Desktop/读取数据进行数据可视化练习/实训作业练习/瓜果类单位面积产量.csv ,encoding utf-8)#输出 print(data)…

高精度加法和动态规划综合运用

高精度加法的原理与手工相加类似&#xff0c;只是在计算时需要考虑到进位和处理较大的数字。下面是实现高精度加法的基本原理&#xff1a; 表示数字&#xff1a; 高精度加法通常通过字符串来表示数字&#xff0c;因为字符串没有固定长度限制&#xff0c;可以容纳任意大的数字。…