[相向双指针] 167. 两数之和 II - 输入有序数组,15. 三数之和,11. 盛最多水的容器,42. 接雨水

news2025/1/16 3:49:11

相向双指针

该文结合灵神讲解进行编码:https://www.bilibili.com/video/BV1bP411c7oJ

相向双指针一般用于有序的数组,两个指针分别从头和尾向中间遍历,直到找到满足条件的 ans

167. 两数之和 II - 输入有序数组

https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/

在这里插入图片描述

Solution

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int l = 0, r = nums.length - 1;
        int sum = 0;
        while (l < r) {
            sum = nums[l] + nums[r];
            if (sum == target) {
                return new int[]{l + 1, r + 1};
            } else if (sum < target) {
                l++;
            } else {
                r--;
            }
        }
        return null;
    }
}

15. 三数之和

https://leetcode.cn/problems/3sum/

在这里插入图片描述

Solution

优化1:若最小前三个数之和已经大于零,那么指针向后移动后的三数之和只会越来越大,因此可以直接退出循环

优化2:如当前 nums[i] 与最大两个数之和小于零,说明只有 i 指针向后移动才能有机会让三数之和等于 0, 因此跳过本次循环

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();
        Arrays.sort(nums); //先排序变为有序数组
        int n = nums.length;
        for (int i = 0; i < n - 2; i++) {
            // 去重
            if (i > 0 && nums[i] == nums[i-1]) {
                continue;
            }
            // 优化1
            if (nums[i] + nums[i+1] + nums[i+2] > 0) {
                break;
            }
            // 优化2
            if (nums[i] + nums[n - 1] + nums[n - 2] < 0) {
                continue;
            }

            int j = i + 1;
            int k = n - 1;
            while (j < k) {
                int sum = nums[i] + nums[j] + nums[k];
                if (sum == 0) {
                    List<Integer> t = new ArrayList<>();
                    t.add(nums[i]);
                    t.add(nums[j]);
                    t.add(nums[k]);
                    ans.add(t);
                    j++; 
                    k--;
                    // 去重
                    while (j < k && nums[j] == nums[j-1]) {
                        j++;
                    }
                    // 去重
                    while (j < k && nums[k] == nums[k+1]) {
                        k--;
                    }
                } else if (sum > 0) {
                    k--;
                } else {
                    j++;
                }
            }
        }
        return ans;
    }
}

11. 盛最多水的容器

https://leetcode.cn/problems/container-with-most-water/

在这里插入图片描述

Solution

class Solution {
    public int maxArea(int[] height) {
        int ans = 0;
        int l = 0, r = height.length - 1;
        while (l < r) {
            ans = Math.max(ans, Math.min(height[l], height[r]) * (r - l));
            if (height[l] > height[r]) {
                r--;
            } else {
                l++;
            }
        }
        return ans;
    }
}

42. 接雨水

https://leetcode.cn/problems/trapping-rain-water/

在这里插入图片描述

Solution1(前后缀分解)

把每一个槽想象为一个水桶,每个水桶能接多少水取决于左边最高的框和右边最高的框,以及桶子底的厚度。

每个水桶能存的水 == min{左边最高框, 右边最高框} - 桶子底的厚度

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int[] left = new int[n];
        int[] right = new int[n];

        int ans = 0;
        left[0] = height[0];
        right[n-1] = height[n-1];
		// 左边最高框
        for (int i = 1; i < n; i++) {
            left[i] = Math.max(height[i], left[i-1]);
        }
		// 右边最高框
        for (int i = n - 2; i >= 0; i--) {  
            right[i] = Math.max(height[i], right[i+1]);
        }
        
        for (int i = 0; i < n; i++) {
            ans += Math.min(left[i], right[i]) - height[i];    
        }
        
        return ans;
    }
}

Solution2(相向双指针)

和 Solution1 是一样的思路,在空间上进行优化,使用左右两个指针向中心遍历。

如果左边遍历的最高的框小于右边最高的框,计算左指针指向的桶子所存的水,左指针向右移动;反之计算右指针所指向桶子所存的水,右指针向左移动。

最后左右指针会停在最高柱子的位置。

class Solution {
    public int trap(int[] height) {
        int n = height.length;
        int l = 0, r = n - 1;
        int preMax = 0, sufMax = 0;
        int ans = 0;

        while (l < r) {
            preMax = Math.max(preMax, height[l]);
            sufMax = Math.max(sufMax, height[r]);
            if (preMax < sufMax) {
                ans += preMax - height[l++];
            } else {
                ans += sufMax - height[r--];
            }
        }
        return ans;
    }
}

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

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

相关文章

声明式查询服务,只需定义,无需实现

1. 概览 在日常开发中&#xff0c;数据查询是最为常见的需求&#xff0c;也是占比最大的一部分。为了降低成本提升开发效率&#xff0c;已经封装了两个组件&#xff1a; 将 QueryObject 与 Spring Data Jpa 进行集成&#xff0c;无需编写实现代码&#xff0c;只需通过注解定义…

大厂永恒敲门砖——Android 系统启动流程详解

正文 AMS 是 Android 中最核心的服务之一&#xff0c;主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作&#xff0c;其职责与操作系统中的进程管理和调度模块相类似&#xff0c;它本身也是一个 Binder 的实现类&#xff0c;应用进程能通过 Binder 机制调…

【Java开发】 Spring 04:云服务器 Docker 环境下安装 Redis 并连接 Spring 项目实现简单 CRUD

Redis是目前使用最多的缓存&#xff0c;包括Spring Boot 中我们也是会用Redis做很多事情。它是完全开源免费的&#xff0c;遵守BSD协议&#xff0c;是一个高性能的key-value数据库&#xff0c;具备数据持久化、多数据结构存储及数据备份等特点。Redis 和 Mongo 同属于文档型数据…

C++17新特性的使用场景总结

一、简单特性 1. namespace 嵌套 C17使我们可以更加简洁使用命名空间&#xff1a; 2. std::variant 升级版的C语言Union 在C17之前&#xff0c;通常使用Union来定义一个可以存储不同类型的变量&#xff0c;现在可以通过std::variant<T1,T2,...> 来定义一个可以存储不同…

Day2.

文章目录一、回文日期1、题目描述2、输入描述3、输出描述4、参考代码二、杨辉三角形1、题目描述2、输入描述3、输出描述4、参考代码一、回文日期 1、题目描述 2020 年春节期间&#xff0c;有一个特殊的日期引起了大家的注意&#xff1a;2020 年 2 月 2 日。因为如果将这个日期…

【2022年11月19日提高A组】消圈策略【DP】

思路&#xff1a; dis i 代表1 到 i 的最短路 因为它要求没有负环 无负环和可以求出最短路是充要条件 然后dis i 和 dis (i1)相差最多不超过1 因为有0边的存在 然后就对边的大小进行分类讨论 如果i<j即e i,j 为-1 那么dis (i) - 1 > dis j 然后移项 dis i - dis j > 1…

云原生|kubernetes|部署MySQL一主多从复制集群(基于GTID的复制)

前言&#xff1a; 一&#xff0c; MySQL的主从复制优点如下&#xff1a; 数据更安全&#xff1a;做了数据冗余&#xff0c;不会因为单台服务器的宕机而丢失数据 性能大大提升&#xff1a;一主多从&#xff0c;不同用户从不同数据库读取&#xff0c;性能提升 扩展性更优&…

如何使用Jekyll在GitHub Pages上搭建网站(个人博客)

本文很长&#xff0c;建议使用侧边栏进行跳转。 前言 Jekyll 是一个基于 Ruby 语言的&#xff0c;用于搭建静态网站的生成器&#xff0c;主要用于搭建博客网站&#xff08;官方自己的介绍为&#xff1a;Jekyll is a blog-aware, static site generator in Ruby&#xff09;。…

html制作网页案例代码----(故宫博物馆9页)特效很多

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 茶文化网站 | 中华传统文化题材 | 京剧文化水墨风书画 | 中国民间年画文化艺术网站 | 等网站的设计与制作 | HTML期末大学生网页设计作业&#xff0c;We…

Tauri+Vite+Vue3创建项目步骤

1、按照官网文档创建tauri项目 npm create tauri-app 然后按顺序填&#xff1a; 1、项目名称&#xff1a; 2、选择你的package manager 3、选择你的前端框架 然后再一步一步执行下面命令 cd 刚才创建的项目名称 npm install npm run tauri dev 然后出现 第一次可能没有反…

基于java+ssm的理论课_考勤,作业,签到管理系统

本理论课管理系统采用目前最流行的ssm框架和eclipse编辑器、mysql数据库设计并实现的 。主要包括登录模块、课程信息管理模块、考勤信息管理模块、成绩管理模块、和退出模块等多个模块 本系统基于SSM(SpringSpringMVCMyBatis)框架,适用于毕业设计&#xff0c;采用javaweb,基于B…

Android 驾车出行路线规划

好久没有写了&#xff0c;今天又是加班的一天&#xff0c;先随便写点东西吧。 最近在搞一款自驾游的项目&#xff0c;需要用到地图&#xff0c;扒了点高德上的数据&#xff0c;便集成了高德地图SDK。之前的项目大部分都只是用了定位&#xff0c;其中有一款也用了地图poi的搜索…

js的promise的究竟是同步还是异步的问题和promise.all可以同时请求多个接口是错误的回答的原因

个人理解 前景-代码输出结果是什么 我们都知道,循环队列的时候,同步任务大于异步任务(异步任务里面的微任务又大于宏任务),那么你猜猜这个代码输出结果是 什么呢 <script>setTimeout(() > {console.log(1); }, 0);new Promise(function(resolve,reject){console.lo…

各省市ZF工作BG环境规制环境词汇词频分析(2009-2019年)

各省市ZF工作报告及环境词汇词频分析 1、时间&#xff1a;2009-2019年 2、说明&#xff1a;环保词频汇总分析&#xff1a;通过手工搜集整理出2009-2019年全国31个省ZF工作报告中环境规制相关的环保词汇及环保词频。 3、词汇包括&#xff1a; 环境保护、环保、污染、能耗、减…

NeurIPS 22|四分钟内就能训练目标检测器!( AGVM)

文章目录引言方法介绍实验过程结果分析引言 来自商汤的基模型团队和香港大学等机构的研究人员提出了一种大批量训练算法 AGVM&#xff0c;该研究已被NeurIPS 2022接收。 本文提出了一种大批量训练算法 AGVM (Adaptive Gradient Variance Modulator)&#xff0c;不仅可以适配于…

Shell脚本

文章目录Shell脚本学习1. Shell概念1.1Shell脚本的好处1.2 Shell脚本的入门1.2.1 Linux环境中默认Shell版本1.2.2 Shell脚本1.2.3 编写简单的hello,world 脚本1.2.4 Shell 脚本的多种执行方法1.2.4.1 第一种 bash 或 sh 加文件的路径1.2.4.2 第二种 文件的路径直接执行1.2.4.2.…

Day07--wxs的概念以及其基本的用法

一.概念 1.啥子是wxs呢&#xff1f; *****************************************************************************************************************************************************************************************************************************…

【附源码】Python计算机毕业设计特大城市地铁站卫生防疫系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

数字电路和模拟电路-10时序逻辑电路的分析和设计

前言&#xff1a;学习同步时序逻辑电路的分析、设计 一、同步时序逻辑电路的分析 1、时序逻辑电路的分析步骤 步骤一 逻辑图 同步or异步 计数器or状态机 一条总线同步&#xff0c;多条总线是异步 计数器无输入&#xff0c;状态机有输入 状态机还分摩尔型和米里型 步骤二 驱动…

力扣(LeetCode)17. 电话号码的字母组合(C++)

回溯 将 222——999 和字母对应起来&#xff0c;用字符串数组保存。 递归遍历 digitsdigitsdigits 每一个数字&#xff0c;每一个数字对应的字母&#xff0c;又可以递归遍历&#xff0c;和下一个数字的字母组成排列。当排列长度等于 digitsdigitsdigits 的长度&#xff0c;就…