双指针模板

双指针核心思想

将双重for循环优化成O(n)

双指针模板

int left = 0, right = n-1;
while(l < r){//处理代码//left处理//right处理
}

滑动窗口模板

滑动窗口本质上也是双指针,不过i的处理时每次很多情况下都是加1,同时对窗口记录进行简单处理

for(int i = 0, j = i; i < n; i++){while(j < n && check(i,j)){//处理代码j++;}//核心代码//i, j处理代码 注意i在for循环中会i++
}

双指针例题

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。

//暴力思路:双重遍历数组,确定左边,再遍历右边,找到最大值
//双指针:交替寻找左右指针的当前最大值,从而确定最大值
class Solution {public int maxArea(int[] height) {int left = 0;int right = height.length - 1;int maxArea = 0;while(left < right){int cur = Math.min(height[left], height[right]) * (right - left);maxArea = Math.max(cur, maxArea);//System.out.println(height[left] + " " +height[right]);if(height[right] > height[left]){left++;}else{right--;}}     return maxArea;}
}

15. 三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。
返回所有和为 0 且不重复的三元组。

//双指针:先确定一个,再用双指针确定其他两个,注意处理重复值
//备忘:
//new ArrayList<>(Arrays.asList(nums[i], nums[l], nums[r])) 多个数转ArrayList
//ArrayList<List<Integer>> re = new ArrayList<>(set); set转ArrayList
class Solution {public List<List<Integer>> threeSum(int[] nums) {HashSet<List<Integer>> set = new HashSet<>();Arrays.sort(nums);int n = nums.length;for (int i = 0; i < n; i++) {while(i != 0 && i < n && nums[i] == nums[i-1]){i++;}int l = i + 1, r = n - 1;while(l < r){if(nums[i] + nums[l] + nums[r] == 0){set.add(new ArrayList<>(Arrays.asList(nums[i], nums[l], nums[r])));l++;r--;while(l < r && nums[l] == nums[l-1]) l++;while(l < r && nums[r] == nums[r+1]) r--;}else if(nums[i] + nums[l] + nums[r] < 0){l++;while(l < r && nums[l] == nums[l-1]) l++;}else{r--;while(l < r &&  nums[r] == nums[r+1]) r--;}}}ArrayList<List<Integer>> re = new ArrayList<>(set);return re;}
}

42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

//思路:leftMax:左边当前最高的柱子 rightMax:右边当前最高的柱子  height[i]表示当前柱子高度
// 如果 leftMax < rightMax,意味着当前这个位置的一定可以以leftMax作为左边边界,装下leftMax-height[left]容量水
// 如果 leftMax >= rightMax,意味着当前这个位置的一定可以以rightMax作为右边边界,装下rightMax-height[right]容量水
//为什么哪个小就可以确定下来呢?因为一个水桶的容积取决于最短那块板
class Solution {public int trap(int[] height) {int sum = 0;int  n = height.length;int left = 0, right = n -1;int leftMax = height[left], rightMax = height[right];//通过比较左右最大值,确定当前的容器的可用高度,之后累加得到结果while(left < right){     //当左边最大值 小于 右边最大值,则left位置的容器的可用高度可以确定为leftMax;if(leftMax < rightMax){sum += (leftMax - height[left]);left++;}else{sum += (rightMax - height[right]);right--;}leftMax = Math.max(leftMax, height[left]);rightMax = Math.max(rightMax, height[right]);}return sum;}
}

滑动窗口例题

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度

//思路:确定i,j移动条件是,[i,j]区域内没有重复字符。出现重复字符,则i++
//这里面的窗口记录可以看作set
class Solution {public int lengthOfLongestSubstring(String s) {int max = 0;int n = s.length();char[] c = s.toCharArray();HashSet<Character> set = new HashSet<>();for(int i = 0, j = i; i < n; i++){while(j < n && !set.contains(c[j])){set.add(c[j]);j++;}max = Math.max(max, set.size());set.remove(c[i]);}return max;}
}

438. 找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)

//思路:确定i,j的移动条件是[i,j]中的字符与p中相同,且字母个数小于p中字母个数。否则移动i
//移动i的技巧,如果j的字母不存在于p中,i = j, j++;如果存在于p中,且i++,因为[i,j]还存在答案的可能
//其他技巧:字符串中仅有小写或大写,可以用int[]模拟map
//这里面的窗口记录可以看作map
class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> ans = new ArrayList<>();int[] map = new int[26];int slen = s.length(), plen = p.length();char[] sc = s.toCharArray();for(char c : p.toCharArray()){map[c - 'a']++;}int[] tmap = Arrays.copyOf(map, 26);for(int i = 0, j = i; i < slen && j < slen; i++){//System.out.println(tmap[0] + " " + tmap[1] + " " + tmap[2]);while(j < slen && tmap[sc[j] - 'a'] > 0){tmap[sc[j] - 'a']--;j++;}// System.out.println(sc[i] + " " + sc[j]);if((j - i) == plen){ans.add(i);}if(j == slen) break;if(map[sc[j] - 'a'] <= 0) {i = j;j++;tmap = Arrays.copyOf(map, 26);}else{tmap[sc[i] - 'a']++;}}return ans;}
}

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

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

相关文章

RTC晶振两端要不要挂电容

发现GD32的RTC晶振两端需要挂电容&#xff0c;STM32的RTC晶振两端不需要挂电容。 STM32的RTC晶振两端&#xff0c;不需要挂电容&#xff0c;这样晶振启振很容易&#xff0c;挂大了&#xff0c;却难启动&#xff0c;且温度越低&#xff0c;启动越难。 有人说负载电容为6pF的晶振…

SQL分类及通用语法数据类型

一、SQL分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据库…

Go语言开发者的Apache Arrow使用指南:读写Parquet文件

Apache Arrow是一种开放的、与语言无关的列式内存格式&#xff0c;在本系列文章[1]的前几篇中&#xff0c;我们都聚焦于内存表示[2]与内存操作[3]。 但对于一个数据库系统或大数据分析平台来说&#xff0c;数据不能也无法一直放在内存中&#xff0c;虽说目前内存很大也足够便宜…

uniapp中我使用uni.navigateTo跳转webview页面传参,但是接收的参数只有一半。

在uniapp中使用uni.navigateTo跳转webview页面传参时&#xff0c;可能会遇到接收的参数只有一半的情况。这可能是因为在跳转时&#xff0c;url的长度超过了限制。为了解决这个问题&#xff0c;可以使用encodeURIComponent和decodeURIComponent进行编码和解码。 具体的解决办法…

SpringBoot

SpringBoot 微服务阶段 javase&#xff1a; OOPmysql&#xff1a;持久化htmlcssjsjquery框架javaweb&#xff1a;MVC 三层架构 的网站ssm&#xff1a;简化了开发流程 配置也相对复杂Spring&#xff1a;SpringBoot&#xff1a;内嵌Tomact 微服务架构springCloud SpringBoot S…

云原生全栈体系(二)

Kubernetes实战入门 第一章 Kubernetes基础概念 一、是什么 我们急需一个大规模容器编排系统kubernetes具有以下特性&#xff1a; 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器&#xff0c;如果进入容器的流量很大&#xff0c;Kubernetes 可以负…

CSS调色网有哪些

本文章转载于湖南五车教育&#xff0c;仅用于学习和讨论&#xff0c;如有侵权请联系 1、https://webgradients.com/ Wbgradients 是一个在线调整渐变色的网站 &#xff0c;可以根据你想要的调整效果&#xff0c;同时支持复制 CSS 代码&#xff0c;可以更好的与开发对接。 Wbg…

经典CNN(三):DenseNet算法实战与解析

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 1 前言 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为最主流的方法&#xff0c;比如GoogleNet&#xff0c;…

opencv 30 -图像平滑处理01-均值滤波 cv2.blur()

什么是图像平滑处理? 图像平滑处理&#xff08;Image Smoothing&#xff09;是一种图像处理技术&#xff0c;旨在减少图像中的噪声、去除细节并平滑图像的过渡部分。这种处理常用于预处理图像&#xff0c;以便在后续图像处理任务中获得更好的结果。 常用的图像平滑处理方法包括…

C++ 左值和右值

C 左值和右值 左值、右值左值引用、右值引用std::move()std::move()的实现引用折叠 完美转发forward()的实现函数返回值是左值还是右值如何判断一个值是左值还是右值 左值、右值 在C11中所有的值必属于左值、右值两者之一&#xff0c;右值又可以细分为纯右值、将亡值。在C11中…

OpenShot 发布 2.3.2 版本啦!

导读OpenShot 2.3.3 发布了&#xff0c;Openshot 是 linux 的 Gnome 桌面一个非线性视频编辑器&#xff0c;有许多功能&#xff1a;你可以重划大小&#xff0c;修剪或者剪切视频&#xff0c;同时有实时的预览&#xff0c;图片覆盖&#xff0c;标题模板&#xff0c;视频解码&…

Exploring the Underlying Architecture of CSS3

引言 在现代的网页设计中&#xff0c;CSS&#xff08;层叠样式表&#xff09;起着至关重要的作用。CSS3作为最新的CSS标准&#xff0c;引入了许多令人兴奋的功能和特性。但是&#xff0c;要真正理解CSS3的底层架构实现原理&#xff0c;对于前端开发者来说&#xff0c;是非常重…

web前端框架Javascript之JavaScript 异步编程史

早期的 Web 应用中&#xff0c;与后台进行交互时&#xff0c;需要进行 form 表单的提交&#xff0c;然后在页面刷新后给用户反馈结果。在页面刷新过程中&#xff0c;后台会重新返回一段 HTML 代码&#xff0c;这段 HTML 中的大部分内容与之前页面基本相同&#xff0c;这势必造成…

PHP 前后端分离,运行配置

H5 WEB目录:安装 yarn install、npm install &#xff08;依赖包&#xff09; 在电脑&#xff1a;安装nodejs Composer下载 &#xff1a;https://getcomposer.org/

python 计算图片hash 缓存图片为key

python&#xff0c;有时希望缓存图片作为key&#xff0c;怎么办&#xff1f;缓存整张突破占用内存太多&#xff0c;不妨缓存hash值&#xff1a; Fast way to Hash Numpy objects for Caching import hashlib import numpy a numpy.random.rand(10, 100) b a.view(numpy.uin…

性能测试,python 内存分析工具 -memray

Memray是一个由彭博社开发的、开源内存剖析器&#xff1b;开源一个多月&#xff0c;已经收获了超8.4k的star&#xff0c;是名副其实的明星项目。今天我们就给大家来推荐这款python内存分析神器。 ​ Memray可以跟踪python代码、本机扩展模块和python解释器本身中内存分配&#…

考完软考,有什么备考心得和学习经验可以分享吗?

我考过信息系统项目管理师&#xff0c;可以给你一些备考建议。这是软考高级资格考试的一门科目&#xff0c;考试包括三个部分。如果你觉得难度较大&#xff0c;可以先从系统集成考试开始&#xff0c;积累经验再去考高级科目。考试内容包括信息系统项目管理综合知识、信息系统项…

A TupleBackedMap cannot be modified Mybatis分页,使用List<Map>接参,无法修改map的解决方案

问题描述 当使用Mybatis 进行Page分页&#xff0c;再使用Page< map >作为接受参数。此时尝试修改map则会报错。 报错为 java.lang.UnsupportedOperationException: A TupleBackedMap cannot be modified解决方案 使用新的数组&#xff0c;使用反射&#xff0c;构建工具…

C语言中char、short、int、long各占多少字节

1byte 8bit 一个字节占8个二进制位 windows操作系统&#xff0c;32位机中&#xff0c; char&#xff1a; 1个字节 short&#xff1a; 2个字节 int&#xff1a; 4个字节 long&#xff1a; 4个字节 以下是windows操作系统&#xff0c;32位机下的代码测试结果&#xff08;3…

深入理解机器学习与极大似然之间的联系

似然函数&#xff1a;事件A的发生含着有许多其它事件的发生。所以我就把这些其它事件发生的联合概率来作为事件A的概率&#xff0c;也就是似然函数。数据类型的不同&#xff08;离散型和连续性&#xff09;就有不同的似然函数 极大似然极大似然估计方法&#xff08;Maximum Li…