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

news2024/11/24 14:11:22

欢迎关注个人主页:逸狼


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

如有错误,欢迎指出~



有效三角形的个数

题目链接

解法

解法1:暴力枚举--->O(n^3)

解法2:利用单调性,使用双指针来解决---->O(n^2)

  1. 优化:对整个数组进行排序
  2. 先固定最大数
  3. 在最大数的左区间内,使用双指针算法,快速统计出符合要求的个数

统计分为两种情况:

  • 能构成三角形的 a+b>c 
  • 不能构成三角形的 a+b<=c 

画图举例

代码

class Solution {
    public int triangleNumber(int[] nums) {
        Arrays.sort(nums);
        int n=0,i=nums.length-1;
        while(i>=2){
            int left=0,right=i-1;
            while(left<right){           
                if(nums[left]+nums[right]>nums[i]){
                    n+=(right-left);
                    right--;
                }else{
                    left++;
                }
            }
            i--;
        }
        return n;
    }
}
class Solution {
    public int triangleNumber(int[] nums) {
        Arrays.sort(nums);
        int ret=0,n=nums.length;
        for(int i =n-1;i>=2;i--){
            int left=0,right=i-1;
            while(left<right){
                if(nums[left]+nums[right]>nums[i]){
                    ret+=(right-left);
                    right--;
                }else{
                    left++;
                }
            }
        }
        return ret;
    }
}

查找总价格为目标值的两个商品

题目链接

解法

解法一:暴力枚举,时间复杂度:O(n^2)--->超时

解法二:利用单调性,使用双指针算法解决,时间复杂度:O(n)

用sum表示两数相加的值,t表示目标值,无非就三种情况:

  • sum<t  ---->left++
  • sum>t  --->right--
  • sum=t  ---->返回结果

注意:本题一定是有返回结果的,但为了照顾编译器,最后可以随意返回一个数组

画图举例

代码

class Solution {
    public int[] twoSum(int[] price, int target) {
        int sum=0,left=0,right=price.length-1;
        while(left<right){
            sum=price[left]+price[right];
            if(sum<target){
                left++;
            }else if(sum>target){
                right--;
            }else{
                return new int[]{price[left],price[right]};
            }
        }
        //照顾编译器
        return new int[]{0};
    }
}

三数之和

题目链接

解法

解法一:排序+暴力枚举+利用set去重, 时间复杂度:O(n^3)

解法二:排序+双指针

  1. 排序
  2. 固定一个数a
  3. 在该数后面的区间内,利用"双指针算法"快速找到两个数的和等于 -a即可

处理细节问题:

  • 去重
    1. 找到一种结果后,left和right指针要跳过重复的元素,
    2. 当使用完一次双指针算法之后,i也要跳过重复元素(细节1和2都要避免越界)
  • 不漏
    • 找到一种结果之后,不要停,缩小区间,继续寻找

画图举例

代码

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        Arrays.sort(nums);
        List<List<Integer>> ret=new ArrayList<>();
        int n=nums.length;
        for(int i = 0;i < n;){
            if(nums[i] > 0) break;

            int left=i+1,right =n-1,target=-nums[i];
            
            while(left < right){
                int sum=nums[left]+nums[right];
                if(sum > target) right--;
                else if(sum < target) left++;
                else{
                    ret.add(new ArrayList<Integer>(Arrays.asList(nums[i],nums[left],nums[right])));
                    left++;right--;//缩小区间,继续寻找
                    //left,right去重
                    while(left < right && nums[left] == nums[left-1]) left++;
                    while(left < right && nums[right] == nums[right+1]) right--;
                }
            }
            i++;
            //i去重
            while(i < n && nums[i] ==nums[i-1]) i++;
        }
        return ret;
    }
}

四数之和

题目链接

解法

解法1:排序 + 暴力枚举 + 利用set去重

解法2: 排序 + 双指针(主要利用"三数之和"(上一题)的思路)

  1. 依次固定一个数a;
  2. 在a后面的区间内,利用"三数之和" 找到三个数,是这三个数等于target-a即可
    1. 依次固定一个数b
    2. 在b的后面的区间内,利用双指针找到两个数,是这两个数的和等于target-a-b即可

处理细节:

  • 不重
  • 不漏

画图举例

代码

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        Arrays.sort(nums);
        List<List<Integer>> ret = new ArrayList<>();
        int n = nums.length;
        for(int i=0;i<n;){//固定数a
            for(int j=i+1;j<n;){//固定数b
                int left=j+1,right=n-1;
                long aim=(long)target-nums[i]-nums[j];//可能有溢出的风险,所以用long
                while(left<right){
                    int sum = nums[left] + nums[right];
                    if(sum > aim) right--;
                    else if(sum < aim) left++;
                    else{
                        ret.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
                        left++; right--;
                        //left 和 right 去重
                        while(left < right && nums[left] == nums[left-1]) left++;
                        while(left < right && nums[right] == nums[right+1]) right--;
                    } 
                }
                j++;
                //j去重
                while(j<n && nums[j] == nums[j-1]) j++;

            }
            i++;
            //i去重
            while(i<n && nums[i] == nums[i-1]) i++;
        }
        return ret;
    }
}

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

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

相关文章

文心智能体 城市印象之漫行北京 开发分享

城市印象之漫行北京 请点击文心智能体平台AgentBuilder | 想象即现实 (baidu.com) 一、开发灵感 这个智能体为笔者“城市印象”系列当中的作品之一&#xff0c;这个智能体侧重于为用户提供丈量北京的个性化城市之旅&#xff0c;或漫步历史文化街区细细品味&#xff0c;或领略…

动态内存管理之malloc,free,calloc和realloc函数

Hello&#xff0c;各位小伙伴们&#xff0c;小编在这里祝福各位中秋佳节快乐呀&#xff0c;今天让我们来学习一下动态内存管理吧&#xff01; 引言 像我们之前在开辟一段空间的时候你可能会使用整型变量来申请一块空间&#xff0c;或者使用数组来申请一段连续的空间&#xff…

网络协议全景:Linux环境下的TCP/IP、UDP

目录 1.UDP协议解析1.1.定义1.2.UDP报头1.3.特点1.4.缓冲区 2.TCP协议解析2.1.定义2.2.报头解析2.2.1.首部长度&#xff08;4位&#xff09;2.2.2.窗口大小2.2.3.确认应答机制2.2.4.6个标志位 2.3.超时重传机制2.4.三次握手四次挥手2.4.1.全/半连接队列2.4.2.listen2.4.3.TIME_…

复选按钮QCheckBox

使用场景&#xff1a;多选多 文本 // 获取和设置显示的文本 QString text() const void setText(const QString &text) 三态 复选按钮有三种状态 Qt::Checked 选中Qt::Unchecked 非选中Qt::PartiallyChecked 半选中&#xff0c;比如一组复选按钮中&#xff0c;只选择了…

PointNet++改进策略目录

后续我将如何使用文章中创新点加入的PointNet中代码实现部分进行更新 题目原理解析代码改进PointNet改进策略 &#xff1a;模块改进 | LFA | RandLA-Net&#xff0c;通过随机采样与局部特征聚合提升大规模3D点云处理效率✔️❌PointNet改进策略 &#xff1a;模块改进 | Residua…

Renesas R7FA8D1BH (Cortex®-M85)控制SHT20

目录 概述 1 硬件接口介绍 2 SHT20模块 2.1 SHT20简介 2.2 SHT-20模块电路 3 I2C接口实现 3.1 FSP配置I2C 3.2 I2C驱动程序实现 4 SHT20驱动程序 4.1 SHT20驱动代码结构 4.2 源代码文件 5 测试 5.1 测试功能介绍 5.2 测试代码实现 5.3 运行代码 概述 本文主要介…

ubuntu虚拟机装载共享文件夹导致的诡异错误

最近使用vmware station 15 安装了 ubuntu22.04 的虚拟机。在装载共享文件夹不久后便会出现诡异的错误。目前在网络上好像没有人把这归结到装载共享文件夹的问题上&#xff0c;故以供参考。 第一次&#xff1a; 在装载之后大概第二次开机&#xff0c;出现报错界面。 提示蓝牙…

C++二叉搜索树学习

目录 一、二叉搜索树概念 二、二叉搜索树的性能分析 三、二叉搜索树的构建 一、二叉搜索树概念 二叉搜索树又叫做二叉排序树&#xff0c;它可以是一颗空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若该树的左子树不为空&#xff0c;那么左子树上的任一节点都小…

硬件工程师笔试面试——存储器件

目录 16、存储器件 16.1 基础 存储器件实物图 16.1.1 概念 16.1.2 常见的存储器件及其特点 16.2 相关问题 16.2.1 不同类型的存储器件在成本和性能上有哪些具体的差异 16.2.2 如何根据应用需求选择合适的存储器件? 16.2.3 存储器件的耐用性和可靠性是如何影响其在不同…

【Unity】 HTFramework框架(五十六)MarkdownText:支持运行时解析并显示Markdown文本

更新日期&#xff1a;2024年9月15日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 MarkdownText支持的Markdown语法标题强调文本表格嵌入图像超链接 使用MarkdownText设置项运行时属性解析使用ID模式嵌入图像 MarkdownText MarkdownText…

【算法思想·二叉搜索树】基操篇

本文参考labuladong算法笔记[二叉搜索树心法&#xff08;基操篇&#xff09; | labuladong 的算法笔记] 1、概述 我们前文 东哥带你刷二叉搜索树&#xff08;特性篇&#xff09; 介绍了 BST 的基本特性&#xff0c;还利用二叉搜索树「中序遍历有序」的特性来解决了几道题目&am…

OpenAI的o1模型与Transformer的无限潜力:数学证明推理算力无上限

近期&#xff0c;斯隆奖得主马腾宇和Google Brain推理团队创始人Denny Zhou合作&#xff0c;提出了一项引人注目的数学证明&#xff1a;只要思维链&#xff08;CoT&#xff09;足够长&#xff0c;Transformer就有能力解决各种复杂问题。这一发现引发了广泛关注&#xff0c;因为…

驱动器磁盘未格式化难题:深度剖析与恢复实践

驱动器磁盘未格式化的深层探索 在数据存储与管理的日常中&#xff0c;驱动器作为我们数字生活的基石&#xff0c;其稳定性直接关系到数据的安全与可用性。然而&#xff0c;当屏幕上赫然出现“驱动器中的磁盘未被格式化”的提示时&#xff0c;许多用户往往感到手足无措&#xf…

把设计模式用起来!(3)用不好模式?之时机不对

上一篇&#xff1a;《把设计模式用起来&#xff08;2&#xff09;——用不好&#xff1f;之实践不足》 本篇继续讲设计模式用不好的常见原因&#xff0c;这是第二个&#xff1a;使用设计模式的时机不对。 二、时机不对 这里说的时机并不是单纯指软件研发周期中的时间阶段&…

C++11新增特性:lambda表达式、function包装器、bind绑定

一、lambda表达式 1&#xff09;、为啥需要引入lambda&#xff1f; 在c98中&#xff0c;我们使用sort对一段自定义类型进行排序的时候&#xff0c;每次都需要传一个仿函数&#xff0c;即手写一个完整的类。甚至有时需要同时实现排升序和降序&#xff0c;就需要各自手写一个类&…

基于SSM的社区爱心捐赠管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于JavaSSMVueMySQL的社区爱…

任嘉伦新剧《流水迢迢》:卫昭多层人设引关注

近日&#xff0c;由晋江文学城同名小说改编的武侠古装爱情传奇剧《流水迢迢》即将开播&#xff0c;这部由任嘉伦主演的新剧&#xff0c;在原著和阵容的双双加持下热度直线上涨&#xff0c;宣传阶段就已备受网友期待&#xff0c;预约人数截止9月13日已达到206万&#xff0c;上升…

通信工程学习:什么是GPON吉比特无源光网络

GPON&#xff1a;吉比特无源光网络 GPON&#xff08;Gigabit-Capable Passive Optical Network&#xff0c;吉比特无源光网络&#xff09;是一种基于ITU-T G.984.x标准的最新一代宽带无源光综合接入技术。该技术以其高带宽、高效率、大覆盖范围和用户接口丰富等特点&#xff0c…

ubuntu服务器版NVIDIA驱动失效解决方案

ubuntu服务器版NVIDIA驱动失效解决方案 1. 问题描述2. 解决方法--卸载并重新安装最新版显卡驱动cudacudnn2.1 卸载显卡驱动2.2 重新安装最新版显卡驱动cudacudnn2.2.1 显卡驱动2.2.2 cuda2.2.3 cuda安装cudnn 1. 问题描述 在终端输入nvidia-smi&#xff0c;输出如下&#xff1…

Leetcode—移除元素

移除元素 题目描述 思路 思路&#xff1a;定义两个指针变量指向数组第一个位置&#xff0c;判断nums[scr]是否等于val case1:相等&#xff0c;scr; case2:不相等&#xff0c;nums[dst]nums[scr],scr,dst; 时间复杂度&#xff1a;O&#xff08;n&#xff09;&#xff1b;空间复杂…