class050 双指针技巧与相关题目【算法】

class050 双指针技巧与相关题目【算法】

算法讲解050【必备】双指针技巧与相关题目
在这里插入图片描述

code1 922. 按奇偶排序数组 II

// 按奇偶排序数组II
// 给定一个非负整数数组 nums。nums 中一半整数是奇数 ,一半整数是偶数
// 对数组进行排序,以便当 nums[i] 为奇数时,i也是奇数
// 当 nums[i] 为偶数时, i 也是 偶数
// 你可以返回 任何满足上述条件的数组作为答案
// 测试链接 : https://leetcode.cn/problems/sort-array-by-parity-ii/

奇数指针,偶数指针

package class050;// 按奇偶排序数组II
// 给定一个非负整数数组 nums。nums 中一半整数是奇数 ,一半整数是偶数
// 对数组进行排序,以便当 nums[i] 为奇数时,i也是奇数
// 当 nums[i] 为偶数时, i 也是 偶数
// 你可以返回 任何满足上述条件的数组作为答案
// 测试链接 : https://leetcode.cn/problems/sort-array-by-parity-ii/
public class Code01_SortArrayByParityII {// 时间复杂度O(n),额外空间复杂度O(1)public static int[] sortArrayByParityII(int[] nums) {int n = nums.length;for (int odd = 1, even = 0; odd < n && even < n;) {if ((nums[n - 1] & 1) == 1) {swap(nums, odd, n - 1);odd += 2;} else {swap(nums, even, n - 1);even += 2;}}return nums;}public static void swap(int[] nums, int i, int j) {int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}

code2 287. 寻找重复数

// 寻找重复数
// 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n)
// 可知至少存在一个重复的整数。
// 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
// 你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
// 测试链接 : https://leetcode.cn/problems/find-the-duplicate-number/

快指针 慢指针
链表找第一个入环结点

package class050;// 寻找重复数
// 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n)
// 可知至少存在一个重复的整数。
// 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。
// 你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。
// 测试链接 : https://leetcode.cn/problems/find-the-duplicate-number/
public class Code02_FindTheDuplicateNumber {// 时间复杂度O(n),额外空间复杂度O(1)public static int findDuplicate(int[] nums) {if (nums == null || nums.length < 2) {return -1;}int slow = nums[0];int fast = nums[nums[0]];while (slow != fast) {slow = nums[slow];fast = nums[nums[fast]];}// 相遇了,快指针回开头fast = 0;while (slow != fast) {fast = nums[fast];slow = nums[slow];}return slow;}}

code3 42. 接雨水

// 接雨水
// 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水
// 测试链接 : https://leetcode.cn/problems/trapping-rain-water/

求i位置:max(min(左侧最大值和右侧最大值)-i位置的高度,0)

package class050;// 接雨水
// 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水
// 测试链接 : https://leetcode.cn/problems/trapping-rain-water/
public class Code03_TrappingRainWater {// 辅助数组的解法(不是最优解)// 时间复杂度O(n),额外空间复杂度O(n)// 提交时改名为trappublic static int trap1(int[] nums) {int n = nums.length;int[] lmax = new int[n];int[] rmax = new int[n];lmax[0] = nums[0];// 0~i范围上的最大值,记录在lmax[i]for (int i = 1; i < n; i++) {lmax[i] = Math.max(lmax[i - 1], nums[i]);}rmax[n - 1] = nums[n - 1];// i~n-1范围上的最大值,记录在rmax[i]for (int i = n - 2; i >= 0; i--) {rmax[i] = Math.max(rmax[i + 1], nums[i]);}int ans = 0;//   x              x//   0 1 2 3...n-2 n-1for (int i = 1; i < n - 1; i++) {ans += Math.max(0, Math.min(lmax[i - 1], rmax[i + 1]) - nums[i]);}return ans;}// 双指针的解法(最优解)// 时间复杂度O(n),额外空间复杂度O(1)// 提交时改名为trappublic static int trap2(int[] nums) {int l = 1, r = nums.length - 2, lmax = nums[0], rmax = nums[nums.length - 1];int ans = 0;while (l <= r) {if (lmax <= rmax) {ans += Math.max(0, lmax - nums[l]);lmax = Math.max(lmax, nums[l++]);} else {ans += Math.max(0, rmax - nums[r]);rmax = Math.max(rmax, nums[r--]);}}return ans;}}

code4 881. 救生艇

// 救生艇
// 给定数组 people
// people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit
// 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit
// 返回 承载所有人所需的最小船数
// 测试链接 : https://leetcode.cn/problems/boats-to-save-people/

双指针
数组从小到大排序
体重小和体重大一船,或者体重大一船

拓展:两个人体重和只能是偶数才能一船
可以分为奇数数组偶数数组,分别求出再相加

package class050;import java.util.Arrays;// 救生艇
// 给定数组 people
// people[i]表示第 i 个人的体重 ,船的数量不限,每艘船可以承载的最大重量为 limit
// 每艘船最多可同时载两人,但条件是这些人的重量之和最多为 limit
// 返回 承载所有人所需的最小船数
// 测试链接 : https://leetcode.cn/problems/boats-to-save-people/
public class Code04_BoatsToSavePeople {// 时间复杂度O(n * logn),因为有排序,额外空间复杂度O(1)public static int numRescueBoats(int[] people, int limit) {Arrays.sort(people);int ans = 0;int l = 0;int r = people.length - 1;int sum = 0;while (l <= r) {sum = l == r ? people[l] : people[l] + people[r];if (sum > limit) {r--;} else {l++;r--;}ans++;}return ans;}}

code5 11. 盛最多水的容器

// 盛最多水的容器
// 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
// 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水
// 返回容器可以储存的最大水量
// 说明:你不能倾斜容器
// 测试链接 : https://leetcode.cn/problems/container-with-most-water/

双指针l,r
当前height[l]小,l++
否则r–

package class050;// 盛最多水的容器
// 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
// 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水
// 返回容器可以储存的最大水量
// 说明:你不能倾斜容器
// 测试链接 : https://leetcode.cn/problems/container-with-most-water/
public class Code05_ContainerWithMostWater {// 时间复杂度O(n),额外空间复杂度O(1)public static int maxArea(int[] height) {int ans = 0;for (int l = 0, r = height.length - 1; l < r;) {ans = Math.max(ans, Math.min(height[l], height[r]) * (r - l));if (height[l] <= height[r]) {l++;} else {r--;}}return ans;}}

code6 code6 475. 供暖器

// 供暖器
// 冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
// 在加热器的加热半径范围内的每个房屋都可以获得供暖。
// 现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置
// 请你找出并返回可以覆盖所有房屋的最小加热半径。
// 说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
// 测试链接 : https://leetcode.cn/problems/heaters/

双指针i,j
对于每一个房屋[i]找到最优的供暖器[j],最优半径

package class050;import java.util.Arrays;// 供暖器
// 冬季已经来临。 你的任务是设计一个有固定加热半径的供暖器向所有房屋供暖。
// 在加热器的加热半径范围内的每个房屋都可以获得供暖。
// 现在,给出位于一条水平线上的房屋 houses 和供暖器 heaters 的位置
// 请你找出并返回可以覆盖所有房屋的最小加热半径。
// 说明:所有供暖器都遵循你的半径标准,加热的半径也一样。
// 测试链接 : https://leetcode.cn/problems/heaters/
public class Code06_Heaters {// 时间复杂度O(n * logn),因为有排序,额外空间复杂度O(1)public static int findRadius(int[] houses, int[] heaters) {Arrays.sort(houses);Arrays.sort(heaters);int ans = 0;for (int i = 0, j = 0; i < houses.length; i++) {// i号房屋// j号供暖器while (!best(houses, heaters, i, j)) {j++;}ans = Math.max(ans, Math.abs(heaters[j] - houses[i]));}return ans;}// 这个函数含义:// 当前的地点houses[i]由heaters[j]来供暖是最优的吗?// 当前的地点houses[i]由heaters[j]来供暖,产生的半径是a// 当前的地点houses[i]由heaters[j + 1]来供暖,产生的半径是b// 如果a < b, 说明是最优,供暖不应该跳下一个位置// 如果a >= b, 说明不是最优,应该跳下一个位置public static boolean best(int[] houses, int[] heaters, int i, int j) {return j == heaters.length - 1 ||Math.abs(heaters[j] - houses[i]) < Math.abs(heaters[j + 1] - houses[i]);}}

code7 41. 缺失的第一个正数

// 缺失的第一个正数
// 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
// 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
// 测试链接 : https://leetcode.cn/problems/first-missing-positive/

双指针
l:表示l左侧的位置上放好l+1的值
r:垃圾区;最好预期1…r的值都有
①nums[l]=l+1,l++
②nums[l]<=l,垃圾
③nums[l]>r,垃圾
④nums[nums[l]-1]=nums[l],重复垃圾
⑤交换(l,nums[l]-1)
返回l+1

package class050;// 缺失的第一个正数
// 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。
// 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。
// 测试链接 : https://leetcode.cn/problems/first-missing-positive/
public class Code07_FirstMissingPositive {// 时间复杂度O(n),额外空间复杂度O(1)public static int firstMissingPositive(int[] arr) {// l的左边,都是做到i位置上放着i+1的区域// 永远盯着l位置的数字看,看能不能扩充(l++)int l = 0;// [r....]垃圾区// 最好的状况下,认为1~r是可以收集全的,每个数字收集1个,不能有垃圾// 有垃圾呢?预期就会变差(r--)int r = arr.length;while (l < r) {if (arr[l] == l + 1) {l++;} else if (arr[l] <= l || arr[l] > r || arr[arr[l] - 1] == arr[l]) {swap(arr, l, --r);} else {swap(arr, l, arr[l] - 1);}}return l + 1;}public static void swap(int[] arr, int i, int j) {int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;}}

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

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

相关文章

HarmonyOS开发(十):通知和提醒

1、通知概述 1.1、简介 应用可以通过通知接口发送通知消息&#xff0c;终端用户可以通过通知栏查看通知内容&#xff0c;也可以点击通知来打开应用。 通知使用的的常见场景&#xff1a; 显示接收到的短消息、即使消息...显示应用推送消息显示当前正在进行的事件&#xff0c…

dbug_hub 错误 使用多个ILA导致

记录一下vivado调整dbg_hub时钟调整的方法 (dengkanwen.com) 解决方法参考以上链接。 或&#xff0c;使用高速下载器&#xff1f;

MySQL数据库与其管理工具Navicat

这里介绍MySQL数据库和Navicat的使用 1.下载MySQL数据库及MySQL客户端管理工具Navicat 登录www.mysql.com下载MySQL 登录www.navicat.com.cn/download下载客户端管理工具 2.启动MySQL数据库服务器 以管理员身份打开命令提示窗口 找到mysql的bin目录 输入初始化命令mysqld…

Java毕业设计源码—vue+SpringBoot图书借阅管理图书馆管理系统

主要技术 SpringBoot、Mybatis-Plus、MySQL、Vue3、ElementPlus等 主要功能 管理员模块&#xff1a;注册、登录、书籍管理、读者管理、借阅管理、借阅状态、修改个人信息、修改密码 读者模块&#xff1a;注册、登录、查询图书信息、借阅和归还图书、查看个人借阅记录、修改…

Docker 镜像构建的最佳做法

一、镜像分层 使用docker image history命令&#xff0c;可以看到用于在镜像中创建每个层的命令。 1、 使用docker image history命令查看创建的入门镜像中的层。 docker image history getting-started 您应该得到如下所示的输出&#xff1a; IMAGE CREATED…

office办公技能|ppt插件使用

PPT插件获取&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1BOmPioUKeY2TdC-1V-o3Vw 提取码&#xff1a;tdji 一、ppt插件介绍 PPT插件是一种可以帮助用户在Microsoft PowerPoint软件中添加各种额外功能和效果的应用程序。使用PPT插件可以让用户更加轻松地制作出专业、…

Linux环境下用yum安装postgres15

1. 下载PostgreSQL 15 安装包 在官网选择对应版本的安装包 https://www.postgresql.org/download/ Linux | CentOS 7 | PostgreSQL 15 2. 安装PostgreSQL 15 sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-la…

业务场景中Hive解析Json常用案例

业务场景中Hive解析Json常用案例 json在线工具 json格式转换在线工具 https://tool.lu/json/format格式互转&#xff1a; // 格式化可以合并整行显示 {"name":"John Doe","age":35,"email":"johnexample.com"}// 格式化…

(一)rtthread主线程启动流程

&#xff08;一&#xff09;rtthread主线程启动流程 声明1.启动分析2.源码分析 声明 本文主要为个人学习笔记内容总结&#xff0c;有来自网络及其他&#xff0c;如有雷同&#xff0c;请告知。 1.启动分析 基于&#xff1a;rt-thread-v5.0.1 先执行&#xff1a;汇编代码start…

Implicit Neural Representation for Cooperative Low-light Image Enhancement

GitHub - Ysz2022/NeRCo: [ICCV 2023] Implicit Neural Representation for Cooperative Low-light Image Enhancement 参考&#xff1a;ICCV2023 | 将隐式神经表征用于“低光增强”&#xff0c;北大张健团队提出NeRCo (qq.com) 以下三个因素限制了现有低光图像增强方法的应用…

workbench导入sql脚本文件

这里面有个Data Import 点击start Import 刷新一下导入完成

MIT6.S081Lab5:xv6 lazy page allocation

Eliminate allocation from sbrk() 这个相当简单&#xff0c;在sys_sbrk中对growproc的调用注释掉就行&#xff0c;然后把sz加上n。这样应该分配的页面没有分配&#xff0c;同时也没有映射到页表&#xff0c;所以使用这些分配的页面的时候会报错panic: uvmunmap: not mapped。…

Docker 一些设置

一、时间设置 如果容器已经运行了 docker exec -it 容器名或id bash mkdir -p /usr/share/zoneinfo/Asia exit docker cp /usr/share/zoneinfo/Asia/Shanghai 容器ID或容器名:/usr/share/zoneinfo/Asia docker exec -it 容器名或id bash cp /usr/share/zoneinfo/Asia/Shang…

【Https】HTTPS协议 的介绍及作用

HTTPS协议是一种安全的网络传输协议&#xff0c;它在传统的HTTP协议上加入了SSL/TLS加密层&#xff0c;用于保护数据传输的安全性和完整性。HTTPS协议是由HTTP和SSL层组成的&#xff0c;其中SSL&#xff08;安全套接层&#xff09;或其继任者TLS&#xff08;传输层安全协议&…

C++多态(详解)

一、多态的概念 1.1、多态的概念 多态&#xff1a;多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b;学生买票时&am…

【Python深度学习第二版】学习笔记之——神经网络

首先来说对于神经网络这几章看的很懵&#xff0c;虽然作者已经去掉了数学公式相关内容&#xff0c;讲得已经很想让读者容易理解了&#xff0c;奈何读完还是一知半解&#xff0c;下面就以我目前的理解简单记录一下吧&#xff0c;往后了解的多了再回头看一看。 一、张量运算 作…

故宫博物院与周大福珠宝集团 战略合作签约仪式在京举行

12月5日上午&#xff0c;故宫博物院与周大福珠宝集团战略合作签约仪式在故宫博物院故宫文化资产数字化应用研究所举行。文化和旅游部党组成员、故宫博物院院长王旭东&#xff0c;国际儒学联合会常务副会长、原文化部副部长丁伟&#xff0c;国际儒学联合会特别顾问、中国国际友好…

深入了解Java Duration类,对时间的精细操作

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概6000多字&#xff0c;预计阅读时间长需要5分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…

12.Java程序设计-基于Springboot框架的Android学习生活交流APP设计与实现

摘要 移动应用在日常生活中扮演着越来越重要的角色&#xff0c;为用户提供了方便的学习和生活交流渠道。本研究旨在设计并实现一款基于Spring Boot框架的Android学习生活交流App&#xff0c;以促进用户之间的信息分享、学术交流和社交互动。 在需求分析阶段&#xff0c;我们明…

如何使用HadSky搭配内网穿透工具搭建个人论坛并发布至公网随时随地可访问

文章目录 前言1. 网站搭建1.1 网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2 Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3 Cpolar稳定隧道&#xff08;本地设置&#xff09;2.4 公网访问测试 总结 前言 经过多年的基础…