双指针问题(Java编写)

日升时奋斗,日落时自省 

目录

一、移动零

二、盛水最多的容器

三、快乐数

四、复写零

五、三数之和

六、有效三角形的个数

七、四数之和


一、移动零

题目来源:. - 力扣(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.rhkb.cn/news/266196.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范

【Go-Zero】测试API查询信息无法返回数据库信息与api、rpc文件编写规范 大家好 我是寸铁&#x1f44a; 总结了一篇测试API查询信息无法返回数据库信息与api、rpc文件编写规范的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 问题背景 大家好&#xff0c;我是寸铁&#xff01…

浅析扩散模型与图像生成【应用篇】(二)——ADM

2. Diffusion Models Beat GANs on Image Synthesis 该文基于扩散模型主要做了两方面的工作&#xff1a;一是通过多种方式优化改进了UNet网络结构以提升扩散模型的生成效果&#xff1b;二是提出一种类别引导的条件生成方法&#xff0c;通过在多个数据集上的实验结果表明&#x…

NerfStudio安装及第一个场景重建

NerfStudio文档是写在windows和linux上安装&#xff0c;本文记录Linux安装的过程&#xff0c;且我的cuda是11.7 创建环境 conda create --name nerfstudio -y python3.8 conda activate nerfstudio python -m pip install --upgrade pip Pytorch要求2.0.1之后的,文档推荐cud…

【论文阅读】深度学习在过冷沸腾气泡动力学分割中的应用

Application of deep learning for segmentation of bubble dynamics in subcooled boiling 深度学习在过冷沸腾气泡动力学分割中的应用 期刊信息&#xff1a;International Journal of Multiphase Flow 2023 级别&#xff1a;EI检索 SCI升级版工程技术2区 SCI基础版工程技术3区…

代码随想录刷题笔记-Day25

1. 分割回文串 131. 分割回文串https://leetcode.cn/problems/palindrome-partitioning/ 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xf…

Pytorch学习 day01(Jupyter安装

Jupyter 安装过程中遇到的问题&#xff1a; Anaconda的base环境会自动安装Jupyter&#xff0c;但是如果我们要在其他环境中安装Jupyter&#xff0c;就需要注意&#xff0c;该环境的python版本不能高于3.11&#xff0c;且用以下代码安装&#xff1a; conda install nb_conda_…

部署PhotoMaker通过堆叠 ID 嵌入自定义逼真的人物照片

PhotoMaker只需要一张人脸照片就可以生成不同风格的人物照片&#xff0c;可以快速出图&#xff0c;无需额外的LoRA培训。 安装环境 python 3.10gitVisual Studio 2022 安装依赖库 git clone https://github.com/bmaltais/PhotoMaker.git cd PhotoMaker python -m venv venv…

lv19 多态 4

1 虚函数 虚函数&#xff08; 基类指针可指向派生类对象&#xff0c; 动态联编&#xff09; 先看示例&#xff0c;不加virtual&#xff0c;不认对象认指针。 #include <iostream>using namespace std;class A{ public:A(){ }~A(){ }void show(){cout<<"AAA…

江科大stm32学习笔记——【5-2】对射式红外传感器计次旋转编码计次

一.对射式红外传感器计次 1.原理 2.硬件连接 3.程序 CountSensor.c: #include "stm32f10x.h" // Device header #include "Delay.h"uint16_t CountSensor_Count;void CountSensor_Init(void) {//配置RCC时钟&#xff1a;RCC_APB2Perip…

OpenAI Triton 入门教程

文章目录 Triton 简介背景Triton 与 CUDA 的关系 Triton 开发样例样例一&#xff1a;Triton vector addition 算子Triton kernel 实现kernel 函数封装函数调用性能测试 样例二&#xff1a;融合 Softmax 算子动机Triton kernel 实现kernel 封装单元测试性能测试 样例三&#xff…

【知识整理】Git Commit Message 规范

一. 概述 前面咱们整理过 Code Review 一文&#xff0c;提到了 Review 的重要性&#xff0c;已经同过gitlab进行CodeReview 的方式&#xff0c;那么本文详细说明一下对CodeReivew非常重要的Git Commit Message 规范。 我们在每次提交代码时&#xff0c;都需要编写 Commit Mes…

会声会影2024出来了吗?

近年来&#xff0c;随着人们对于娱乐和创意的需求不断增长&#xff0c;视频编辑软件也越来越受到大众的关注。其中&#xff0c;会声会影是一款备受欢迎的视频编辑软件&#xff0c;许多用户都在关注其新版本——会声会影2024。 然而&#xff0c;目前并没有官方宣布会声会影2024的…

如何制作一款建材商城微信小程序

现在&#xff0c;微信小程序已经成为了很多企业和商家开展线上业务的重要渠道之一。对于建材商城而言&#xff0c;制作一款专属的微信小程序可以帮助企业更好地展示产品、提供服务&#xff0c;并增加销售额。下面将介绍如何制作一款建材商城微信小程序。 首先&#xff0c;登录【…

C#,动态规划(DP)金矿问题(Gold Mine Problem)的算法与源代码

1 金矿问题&#xff08;Gold Mine Problem&#xff09; 给定一个N*M尺寸的金矿&#xff0c;每个点都有一个非负数表示当前点所含的黄金数目&#xff0c;最开始矿工位于第一列&#xff0c;但是可以位于任意行。矿工只能向右&#xff0c;右上&#xff0c;右下三个方向移动。问该…

solidity编程

一.Solidity 简介 Solidity 是⼀种⽤于编写以太坊虚拟机&#xff08; EVM &#xff09;智能合约的 编程语⾔。我认为掌握 Solidity 是参与链上项⽬的必备技 能&#xff1a;区块链项⽬⼤部分是开源的&#xff0c;如果你能读懂代码&#xff0c;就可以 规避很多亏钱项⽬。…

javaweb学习(day04-XML)

一、介绍 1 官方文档 地址: https://www.w3school.com.cn/xml/index.asp 2 为什么需要 XML 需求 1 : 两个程序间进行数据通信需求 2 : 给一台服务器&#xff0c;做一个配置文件&#xff0c;当服务器程序启动时&#xff0c;去读取它应当监听的端口号、还有连接数据库的用户名…

php基础学习之错误处理(其一)

一&#xff0c;错误处理的概念 错误处理指的是系统(或者用户)在执行某些代码的时候&#xff0c;发现有错误&#xff0c;就会通过错误处理的形式告知程序员&#xff0c;俗称报错 二&#xff0c;错误分类 语法错误&#xff1a;书写的代码不符合 PHP 的语法规范&#xff0c;语法错…

Qt Android sdk配置报错解决

使用的jdk8总是失败&#xff0c;报错command tools run以及platform sdk等问题。后来主要是设置jdk版本为17&#xff0c;就配置生效了。Android sdk路径可以选用Android Studio自带的&#xff0c;但是也要在Qt中点击“设置SDK”按钮做必要的下载更新等。 编译器这里会自动检测到…

ODOO12设置收发邮件服务器教程

一、设置-技术 二、设置–技术–发件服务器 信息填写完整后&#xff0c;点击‘测试连接’&#xff0c;若提示成功&#xff0c;则发件服务器设置成功。 三、设置–技术–收件服务器 四、设置–参数–系统参数 修改之前的email系统参数&#xff1a; mail.catchall.alias: 收件服…

300分钟吃透分布式缓存(拉钩教育总结)

开篇寄语 开篇寄语&#xff1a;缓存&#xff0c;你真的用对了吗&#xff1f; 你好&#xff0c;我是你的缓存老师陈波&#xff0c;可能大家对我的网名 fishermen 会更熟悉。 我是资深老码农一枚&#xff0c;经历了新浪微博从起步到当前月活数亿用户的大型互联网系统的技术演进…