当前位置: 首页 > news >正文

算法刷题记录-双指针/滑动窗口(LeetCode)

809. Expressive Words

思路

根据题目描述,我们可以知道,如果要将某个单词定义为可扩张(stretchy),需要满足如下两个条件:

所以,我们在实现的时候,可以通过两个指针p1和p2,分别指向s和word,分别统计连续的相同字符数量c1和c2,然后再通过上述的两个条件进行判断,即:如果

(c1 != c2 && c1 < 3) || (c1 < c2 && c1 >= 3)

则表示该单词不是可扩张的。

代码

class Solution {public int expressiveWords(String s, String[] words) {int result = 0;char[] sc = s.toCharArray();for (String word: words) result += stretchyWord(sc, word.toCharArray()) ? 1 : 0;return result;}private boolean stretchyWord(char[] sc, char[] wc) {if (sc.length < wc.length) return false; // word的字符串长度不允许超过s的字符串长度int cp, p1 = 0, p2 = p1;while ((cp = p1) < sc.length && p2 < wc.length) {int c1 = 0, c2 = 0;while (p1 < sc.length && sc[p1] == sc[cp]) {c1++; p1++; // 在字符串s中,遍历连续的字符sc[cp]的数量}while (p2 < wc.length && wc[p2] == sc[cp]) {c2++; p2++; // 在字符串word中,遍历连续的的字符sc[cp]的数量}if ((c1 != c2 && c1 < 3) || (c1 < c2 && c1 >= 3)) return false;}return p1 == sc.length && p2 == wc.length; // 只有sc和wc都被遍历完毕,才返回true}
}

823. Binary Trees With Factors

思路

代码

class Solution {static final long MOD = (long) 1e9 + 7;public int numFactoredBinaryTrees(int[] arr) {Arrays.sort(arr);long[] ans=new long [arr.length];ans[0]=1;for (int i=1;i<arr.length;i++){ans[i]=1;int left=0;int right=i-1;while (left<=right){while (left<=right){long prod= (long) arr[left] *arr[right];if (prod==arr[i]){break;}else if (prod<arr[i]){left++;}else{right--;}}if (left>right){break;}if (left==right){ans[i]+=ans[left]*ans[left];}else{ans[i]+=ans[left]*ans[right]*2;}left++;right--;}ans[i]%=MOD;}long final_ans=0;for (long val:ans){final_ans=final_ans+val;final_ans%=MOD;}return (int)final_ans;}
}

*828. Count Unique Characters of All Substrings of a Given String

思路 贡献法+双指针

请看下图,我们以s=“ABCD”为例,首先,可以将其拆分为10个子串(以“A”为基准的4个子串;以“B”为基准的3个子串;以“C”为基准的2个子串;以“D”为基准的1个子串;),那么由于s字符串中的字符都是彼此不重复的,所以,总结果其实就是“A”、“B”、“C”、“D”这个四个字符在所有10个子串中出现的次数之和,即:A出现4次 + B出现6次 + C出现6次 + D出现4次 = 20。

通过上面的例子,我们将问题转换为某个字符在子串中出现的个数问题了。那么,针对这个问题,其实有3种情况:

情况1:字符是“头元素”,那么出现次数可以通过:数组长度 - 元素下标位置 来计算出来。
情况2:字符是“尾元素”,那么出现次数可以通过:元素下标位置 - (-1) 来计算出来。
情况3:字符是“中间元素”,那么出现次数可以通过:(元素下标位置 - (-1)) * (数组长度 - 元素下标位置) 来计算出来。



那么前面我们是针对于字符串中字符不重复的情况来看的,下面我们再来看一下有重复字符的情况。其实,针对于这种情况,就产生了区间的概念。因为我们上面进行统计的时候,都是针对于某一区间内这个元素是唯一的,所以,如果发生了重复字符,我们就需要将其拆分为多个区间。以下图s="ABCB"为例,当我们要统计元素“B”的时候,由于发生了重复的情况,所以,我们要将其拆分为:
当B的下标=1的时候,它唯一的区间是[0,2] 当B的下标=3的时候,它唯一的区间是[2,3]
那么,由于产生了区间的概念,我们也随之创建两个指针,分别是head和tail,head指向的某区间开始位置的前一个位置;tail指向的是某区间结束为止的后一个位置。那么计算公式最终就是:(某元素下标位置 - head) * (tail - 某元素下标位置)。

我们得出了计算公式之后,就可以针对给出的字符串s中的每个字符进行遍历,在哈希表中记录一下每个元素的所在位置,key=字符,value=该字符出现的位置集合。具体实现,请参照:代码1-哈希表采用哈希表方式实现。如果需要提升执行效率,我们也可以采用数组来记录每个元素的所在位置,26个字母对应数组的坐标,然后一个数组是用来针对某个元素出现多次进行统计

解题思路我们就说完了。下面我们以s=“LEETCODE”为例,看一下具体的计算过程。由于下图中的计算细节已经在图中写出来了,所以这里的文字部分就不去赘述了。具体的计算过程,请参见下图。
在这里插入图片描述

代码1-哈希表

    public int uniqueLetterString(String s) {HashMap<Character, ArrayList<Integer>> map = new HashMap<>();for (int i = 0; i < s.length(); i++) {if (!map.containsKey(s.charAt(i))) {map.put(s.charAt(i), new ArrayList<>());}map.get(s.charAt(i)).add(i);}int ans = 0;for (var pair : map.entrySet()) {int head = -1;int tail = -1;var items = pair.getValue();for (int i = 0; i < items.size(); i++) {tail = i < (items.size() - 1) ? items.get(i + 1) : s.length();ans += (items.get(i) - head) * (tail - items.get(i));head = items.get(i);}}return ans;}

849. Maximize Distance to Closest Person

思路(双指针+贪心)

我们考虑前一个1出现的位置prev,一直向右遍历的位置i每当seats[i]为1时,iprev相减的值即为距离,求所有可能的距离的最大值即可。注意,在实现代码中,考虑的略复杂了一些 其中while(seat[i]==0)的部分可优化为prev=-1。但是,我们一定需要当遍历结束后强制判断一次,因为可能出现类似 [ 1 , 0 , 0 , 0 ] [1,0,0,0] [1,0,0,0]此类序列。

代码

    int maxDistToClosest(vector<int>& seats) {int prev;int i=0;while (seats[i]==0){i++;}prev=i;int max_length=i;for (i++; i < seats.size(); ++i) {if (seats[i]==0){continue;}int length=i-prev-1;max_length=max((int)ceil((double)length/2),max_length) ;prev=i;}int length=seats.size()-prev-1;if (length>max_length){max_length=length;}return max_length;}

881. Boats to Save People

思路

首先对数组进行排序,设置两个指针leftright。令每次救生艇乘坐的人重量最大。若left+right>limit,则说明位于right位置的人需要一个独立的救生艇。当左右指针相遇时,说明剩下需要一个独立的救生艇,再次+1。

代码

class Solution {public int numRescueBoats(int[] people, int limit) {int ans=0;Arrays.sort(people);int left=0;int right=people.length-1;while (left<=right){while (right>left&&people[left]+people[right]>limit){right--;ans++;}if (left==right){ans++;break;}ans++;left++;right--;}return ans;}
}

904. Fruit Into Baskets

思路 双指针+HashMap

构建一个HashMap,令left指针标注序列开始点,right指针标注序列结束点。
每次将一个新水果fruits[right]加入序列,若map的长度大于2,则右移left指针并对map内的fruits[left]进行-1操作,若map[fruit[left]]为0,则表示已完全移除,map长度减一。从此往复,统计map内key的value和的最大值。

代码

    public int totalFruit(int[] fruits) {HashMap<Integer, Integer> map = new HashMap<>();int left = 0;int right = 0;int ans=0;while (right < fruits.length) {map.merge(fruits[right], 1, Integer::sum);while (map.size() > 2) {map.merge(fruits[left], -1, Integer::sum);if (map.get(fruits[left])==0){map.remove(fruits[left]);}left++;}int curr_ans=0;for (var key:map.keySet()){curr_ans+=map.get(key);}ans=Math.max(ans,curr_ans);right++;}return ans;}

2841. Maximum Sum of Almost Unique Subarray

思路 滑动窗口

用滑动窗口枚举长为 k 的子数组,用哈希表记录子数组中各元素出现的次数,以维护当前子数组中不同元素的个数

代码

class Solution {public long maxSum(List<Integer> nums, int m, int k) {HashMap<Integer,Integer>map=new HashMap<>();int left=0;int right=k;long ans=0;long curr_sum=0;for (int i=0;i<k;i++){curr_sum+=nums.get(i);map.merge(nums.get(i),1,Integer::sum);}if (map.size()>=m){ans=Math.max(curr_sum,ans);}while (right<nums.size()){curr_sum+= nums.get(right);curr_sum-= nums.get(left);map.merge(nums.get(right),1,Integer::sum);map.merge(nums.get(left),-1,Integer::sum);if(map.get(nums.get(left))==0){map.remove(nums.get(left));}if (map.size()>=m){ans=Math.max(curr_sum,ans);}left++;right++;}return ans;}}

2844. Minimum Operations to Make a Special Number

思路 滑动窗口

要想被25整除,末尾数字只能是00255075 。只要从最后一个数字遍历即可,若最后一位数字为5,则向前寻找2或者7、否则向前寻找0或者5。

代码

class Solution {public int minimumOperations(String _num) {char[] num=_num.toCharArray();int ans=120;boolean containsZero=false;int end=num.length-1;while (end>0){if (num[end]=='0'||num[end]=='5'){int prev=end-1;if (num[end]=='0'){containsZero=true;while (prev>=0&&(num[prev]!='5'&&num[prev]!='0')){prev--;}}else {while (prev>=0&&(num[prev]!='2'&&num[prev]!='7')){prev--;}}if (prev>=0){ans=Math.min(ans,end-prev-2+num.length-end);}}end--;}if (ans==120){return containsZero? num.length-1 :num.length ;}return ans;}
}

相关文章:

算法刷题记录-双指针/滑动窗口(LeetCode)

809. Expressive Words 思路 根据题目描述&#xff0c;我们可以知道&#xff0c;如果要将某个单词定义为可扩张&#xff08;stretchy&#xff09;&#xff0c;需要满足如下两个条件&#xff1a; 所以&#xff0c;我们在实现的时候&#xff0c;可以通过两个指针p1和p2&#x…...

Python基础tuple元组定义与函数

元组的特点 有序&#xff1a;元组中的元素是按照顺序排列的。不可更改&#xff1a;一旦创建&#xff0c;元组中的元素不可被修改、增加或删除。元素类型多样化&#xff1a;元组可以包含任何数据类型的元素。 定义一个非空元组 name_tuple (a, b, c, d)定义一个空元组 name…...

【linux命令讲解大全】088.深入理解 shell 脚本中的 trap 命令

文章目录 trap概要主要用途选项参数返回值关于信号例子 从零学 python trap 捕捉信号和其他事件并执行命令。 概要 trap [-lp] [[arg] signal_spec ...]主要用途 用于指定在接收到信号后将要采取的动作。 脚本程序被中断时执行清理工作。 选项 -l&#xff1a;打印信号名称…...

bean的管理-bean的获取

获取bean 默认情况下&#xff0c;在Spring项目启动时&#xff0c;会把bean都创建好&#xff08;但是还会受到作用域及延迟初始化的影响&#xff09;放在IOC容器中&#xff0c;如果想主动获取这些bean&#xff0c;可以通过如下方式 根据name获取bean Object getBean&#xff08…...

如何快速清理已经上传到Git仓库的.DS_Store文件

很久以前&#xff0c;发过这样一篇文章《Git全局忽略MacOS系统下的.DS_Store文件》&#xff0c;主要是针对MacOS用户&#xff0c;如何方便的在自己机器中免疫所有.DS_Store文件的误提交。如果有这个需求&#xff0c;且还没有搞过的读者可以通过上面这篇文章学习。 今天想要分享…...

美的的笔试

第一题 有两只猫咪和n条不同类型的鱼&#xff0c;每条鱼都只能被其中一只猫咪吃掉。 下标为i处的鱼被吃掉的得分为: 如果第一只猫咪吃掉,则得分为reward1[i]。如果第二只猫咪吃掉,则得分为reward[i]。 给你一个正整数数组reward1 &#xff0c;一个正整数数组reward2&#xff0…...

Android 1.2 开发环境搭建

目录 1.2 开发环境搭建 1.JDK安装与配置 2.开发工具二选一 3.相关术语的解析 4.ADB命令行的一些指令 5.APP程序打包与安装的流程&#xff1a; 6.APP的安装过程&#xff1a; 7.本节小结 1.2 开发环境搭建 现在主流的Android开发环境有: ①Eclipse ADT SDK ②Android Stu…...

vue 页面加水印

首先创建一个waterMark.js文件&#xff0c;当然文件命名可自定义&#xff0c; use strictconst watermark {}/**** param {要设置的水印的内容} str* param {需要设置水印的容器} container*/ const setWatermark (str, container) > {const id 1.23452384164.123412415…...

Android ImageView详解

scaleType属性详解 在 Android 中&#xff0c;ImageView 控件的 scaleType 属性用于指定图像在 ImageView 内部的缩放和对齐方式。scaleType 属性可以帮助你控制图像的显示方式&#xff0c;以适应 ImageView 的尺寸或实现其他特定的显示效果。以下是常见的 scaleType 属性值和…...

ElasticSearch第二讲:ES详解 - ElasticSearch基础概念

ElasticSearch第二讲&#xff1a;ES详解 - ElasticSearch基础概念 在学习ElasticSearch之前&#xff0c;先简单了解下ES流行度&#xff0c;使用背景&#xff0c;以及相关概念等。本文是ElasticSearch第二讲&#xff0c;ElasticSearch的基础概念。 文章目录 ElasticSearch第二讲…...

Ajax模拟视频点赞功能

前台 <%--Created by IntelliJ IDEA.User: xxDate: 2023/9/4Time: 10:00To change this template use File | Settings | File Templates. --%> <% page contentType"text/html;charsetUTF-8" language"java" %> <html> <head>&l…...

java解决 衣服尺码 Compare T-Shirt Sizes

java解决衣服尺码 时间限制&#xff1a;3000MS 内存限制&#xff1a;589824KB 题目描述&#xff1a; 一般来说衣服尺码分为L&#xff0c;M&#xff0c;S三种&#xff0c;分别代表大(Large)&#xff0c;中(Medium)和小(Small)。不过由于人的身高差异性较大&#xff0c;尺码又会…...

基于python+Django深度学习的音乐推荐方法研究系统设计与实现

摘 要 数字化时代带动着整个社会的信息化发展&#xff0c;随着数字媒体的不断发展&#xff0c;现在通多媒体数字产品的内容越来越丰富&#xff0c;传播影响力越来越强&#xff0c;以音乐为例&#xff0c;现在的音乐文化多样、音乐资源也异常的丰富&#xff0c;在这种大数据的环…...

【枚举区间+线段树】CF Ehu 152 E

Problem - E - Codeforces 题意&#xff1a; 思路&#xff1a; 感觉是个套路题 对区间计数&#xff0c;按照CF惯用套路&#xff0c;枚举其中一个端点&#xff0c;对另一个端点计数 对于这道题&#xff0c;枚举右端点&#xff0c;对左端点计数 Code&#xff1a; #include &…...

宏定义天坑记录

宏定义天坑记录 事件原委与推理过程 在编译一个使用了Protobuf的项目时出现了如下报错 [ybVM-8-7-centos boost_searcher]$ make g -o http_server http_server.cc data/raw_html.pb.cc -stdc11 -lboost_system -lboost_filesystem -lpthread -ljsoncpp -lprotobuf In file…...

Git的一些常用概念与操作方法分享

Git是一个版本控制系统&#xff0c;它可以记录代码的变化历史并允许多个开发者同时对同一代码库进行开发。以下是Git的基本概念和使用方式&#xff1a; 仓库&#xff08;Repository&#xff09;- 保存代码的地方。Git仓库包含了所有的版本历史记录、代码以及其他相关文件。 分…...

webpack实战:某网站JS逆向分析

文章目录 1. 写在前面2. 抓包分析3. 扣加密代码 1. 写在前面 好的逆向能够帮助我们了解加密实现&#xff0c;然后根据加密方式&#xff08;md5,base64,res,des,rsa…)还原加密算法的过程。可以看看我之前的这篇文章&#xff1a;快速定位查找加密方式特征与技巧 目标站点&#…...

826. 安排工作以达到最大收益;2257. 统计网格图中没有被保卫的格子数;816. 模糊坐标

826. 安排工作以达到最大收益 核心思想&#xff1a;排序维护最大利润。首先我们需要对工人按照能力排序&#xff0c;前面工人满足的最大利润后面的工人肯定是满足的&#xff0c;所以我们只需要用一个tmp来维护小于等于当前工人的最大利润&#xff0c;然后如何得到tmp&#xff…...

JAVA毕业设计097—基于Java+Springboot+Vue+uniapp的医院挂号小程序系统(源码+数据库)

基于JavaSpringbootVueuniapp的医院挂号小程序系统(源码数据库)097 一、系统介绍 本系统前后端分离(网页端和小程序端都有) 本系统分为管理员、医院、用户三种角色(角色菜单可自行分配) 用户功能&#xff1a; 注册、登录、医院搜索、最新资讯、医生搜索、挂号预约、挂号记…...

4.3.3.1 【MySQL】CHAR(M)列的存储格式

我们知道 Compact 行格式在 CHAR(M) 类型的列中存储数据的时候还挺麻烦&#xff0c;分变长字符集和定长字符集的情况&#xff0c;而在 Redundant 行格式中十分干脆&#xff0c;不管该列使用的字符集是啥&#xff0c;只要是使用 CHAR(M) 类型&#xff0c;占用的真实数据空间就是…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

用机器学习破解新能源领域的“弃风”难题

音乐发烧友深有体会&#xff0c;玩音乐的本质就是玩电网。火电声音偏暖&#xff0c;水电偏冷&#xff0c;风电偏空旷。至于太阳能发的电&#xff0c;则略显朦胧和单薄。 不知你是否有感觉&#xff0c;近两年家里的音响声音越来越冷&#xff0c;听起来越来越单薄&#xff1f; —…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...