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

分享网站友情链接营销

分享网站友情链接,营销,网页制作有什么软件,网站建设需要什么设备Day3–HOT100–42. 接雨水,3. 无重复字符的最长子串,438. 找到字符串中所有字母异位词 每日刷题系列。今天的题目是力扣HOT100题单。 双指针和滑动窗口题目。其中438题踩了坑,很值得看一下。 42. 接雨水 思路: 每个位置i&#x…

Day3–HOT100–42. 接雨水,3. 无重复字符的最长子串,438. 找到字符串中所有字母异位词

每日刷题系列。今天的题目是力扣HOT100题单。

双指针和滑动窗口题目。其中438题踩了坑,很值得看一下。

42. 接雨水

思路:

每个位置i,能存储的水,等于min(左边的最高的墙,右边最高的墙)减去自身的高度。

开两个数组,preMax 和 postMax,记录i位置的左边最大高度和右边最大高度。

class Solution {public int trap(int[] height) {int n = height.length;int[] preMax = new int[n];int[] postMax = new int[n];// 记录前缀最大值preMax[0] = height[0];for (int i = 1; i < n; i++) {preMax[i] = Math.max(preMax[i - 1], height[i]);}// 记录后缀最大值postMax[n - 1] = height[n - 1];for (int i = n - 2; i >= 0; i--) {postMax[i] = Math.max(postMax[i + 1], height[i]);}// 每个i单位能装的水,等于min(左边最大高度,右边最大高度)减去当前(地面)高度int res = 0;for (int i = 0; i < n; i++) {res += Math.min(preMax[i], postMax[i]) - height[i];}return res;}
}

思路:

对上面的方法进行空间优化。不用preMax只存储单一位置的左边最大高度,postMax同理。

这时候,谁小移动谁,谁小统计谁。

(因为这样才能动起来,如果是谁大移动谁的话,有一边永远是0没有动。具体可以把上一份代码的preMax数组和postMax数组遍历打印出来查看)

class Solution {public int trap(int[] height) {int n = height.length;int res = 0;int preMax = 0;int postMax = 0;int left = 0;int right = n - 1;// 可以不用等于号,中间相遇的柱子是最高的,减去柱子本身高度之后是0,接不了雨水while (left < right) {preMax = Math.max(preMax, height[left]);postMax = Math.max(postMax, height[right]);// 谁小移动谁,谁小统计谁。if (preMax < postMax) {res += preMax - height[left];left++;} else {res += postMax - height[right];right--;}}return res;}
}

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

思路【我】:

滑动窗口三步曲:入–出–更新。

关键是要判断,什么时候该出窗,什么条件下出窗。

这里我们用一个boolean变量,当窗口内有元素达到两个的时候,做标记,开始左边出窗,直到无重复元素。

class Solution {public int lengthOfLongestSubstring(String s) {char[] ch = s.toCharArray();int n = ch.length;// 直接开128,不用ch[i]-'a'int[] map = new int[128];boolean repeat = false;int left = 0;int maxLen = 0;for (int i = 0; i < n; i++) {// 1,入if (++map[ch[i]] == 2) {repeat = true;}// 2,出,如果有重复字符while (repeat) {if (--map[ch[left]] == 1) {repeat = false;}left++;}// 3,更新maxLen = Math.max(maxLen, i - left + 1);}return maxLen;}
}

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

这道题不难,但是折磨了我很久,甚至很长时间都没搞懂问题出在哪里。

思路【我】:

  • 同样是滑动窗口三步曲:入,出,更新——关键也是要判断什么时候该出。
  • 使用两个map,一个map记录target的<元素,出现次数>,另一个map记录当前窗口内的<元素,出现次数>

开始遍历s串:

  1. 如果不是target里面的字母,直接清空,从下一位开始
  2. 如果窗口map的元素达到了p串对应元素的出现次数,types++
  3. while当map的元素出现次数,大于p串对应元素出现次数,左指针元素不断出窗,直到while条件不满足。
  4. 当types和p串的元素种类数相等的时候,就可以加入到结果集
class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> res = new ArrayList<>();char[] ch = s.toCharArray();char[] target = p.toCharArray();Map<Character, Integer> map = new HashMap<>();for (int i = 0; i < target.length; i++) {map.merge(target[i], 1, Integer::sum);}int types = 0;Map<Character, Integer> curMap = new HashMap<>();int left = 0;for (int i = 0; i < ch.length; i++) {// 如果不是target里面的字母,直接清空,从下一位开始if (map.get(ch[i]) == null) {curMap.clear();types = 0;left = i + 1;continue;}// 如果窗口map的元素达到了p串对应元素的出现次数,types++int count = curMap.merge(ch[i], 1, Integer::sum);if (count == map.get(ch[i])) {types++;}// 当元素出现次数,大于p串对应元素出现次数,左指针元素不断出窗while (curMap.get(ch[i]) > map.get(ch[i])) {int leftCount = curMap.merge(ch[left], -1, Integer::sum);if (leftCount == map.get(ch[left]) - 1) {types--;}left++;}// 当types和p串的元素种类数相等的时候,就可以加入到结果集if (types == map.size()) {res.add(left);}}return res;}
}

虽然思路有点累赘,但代码还是过了,可是我第一次写的不是这份代码,是下面这份:

// 提交不通过
if (curMap.merge(ch[i], 1, Integer::sum) == map.get(ch[i])) {types++;
}// 提交通过
int count = curMap.merge(ch[i], 1, Integer::sum);
if (count == map.get(ch[i])) {types++;
}

我当时想了好久,为什么要单独提一个变量出来,提交就通过了,不提出来,难道merge是异步执行的吗?导致判断==的时候出现了问题?

问了豆包AI,超级搞笑,它自问自答自打脸,问了一个小时没有解决问题。直到我把代码丢进了idea编辑器,提示了黄色。

// 提交通过
if (curMap.merge(ch[i], 1, Integer::sum).equals(map.get(ch[i]))) {types++;
}

原来不是merge的问题,是Integer的问题。Java缓存的Integer范围是[-128,127],这个范围内可以用==比较,超出这个范围,就都是新对象了,要用equals来比较!不然比较的是对象的地址值。

思路:

其实不用map,用int[]数组作map,很快就过了。真正做题比赛的时候,不要钻牛角尖。

class Solution {public List<Integer> findAnagrams(String s, String p) {List<Integer> res = new ArrayList<>();char[] ch = s.toCharArray();char[] target = p.toCharArray();int[] map = new int[128];int total = 0;for (int i = 0; i < target.length; i++) {if (++map[target[i]] == 1) {total++;}}int[] curMap = new int[128];int left = 0;int types = 0;for (int i = 0; i < ch.length; i++) {if (map[ch[i]] == 0) {Arrays.fill(curMap, 0);types = 0;left = i + 1;continue;}if (++curMap[ch[i]] == map[ch[i]]) {types++;}while (curMap[ch[i]] > map[ch[i]]) {if (--curMap[ch[left]] == map[ch[left]] - 1) {types--;}left++;}if (types == total) {res.add(left);}}return res;}
}

思路【灵艾山茶府】:

  • 一个map搞定,使用p串的时候++,作为窗口的map的时候–
  • 只要有元素<0的时候,证明减多了,需要出窗。
  • 这样可以保证窗口中每个元素的出现次数,都只能小于等于p<元素,出现次数>,而且还不会有不包含的元素。
  • 当窗口长度==p串长度的时候,证明每个元素都是与p内每个元素的出现次数相等了,假如结果集。
class Solution {public List<Integer> findAnagrams(String s, String p) {char[] ch = s.toCharArray();int n = ch.length;char[] target = p.toCharArray();int[] map = new int[128];List<Integer> res = new ArrayList<>();int left = 0;for (int i = 0; i < target.length; i++) {map[target[i]]++;}for (int i = 0; i < n; i++) {// 1,入map[ch[i]]--;// 2,出。当ch[i]这个元素的出现次数过多while (map[ch[i]] < 0) {map[ch[left]]++;left++;}// 3,更新结果集。当窗口大小等于p串长度if (i - left + 1 == target.length) {res.add(left);}}return res;}
}
http://www.dtcms.com/a/507300.html

相关文章:

  • windows中用wsl使用cuda
  • 运维逆袭志·第3期 | 数据孤岛破局之战 :跨业务分析的难题攻坚
  • 《道德经》第二十一章
  • 第 14 章:Spring AI Alibaba — Nacos3实现动态Prompt
  • TableTime:将时序分类重构为表格理解任务,更有效对齐LLM语义空间
  • Java的main方法语法
  • 【Linux】 层层递进,抽丝剥茧:调度队列、命令行参数、环境变量
  • 火电厂VR安全培训系统怎么样?VR安全培训告别传统培训痛点!
  • 网站建设有哪些工作儿童教育网站源码
  • 开题报告之基于SpringBoot框架的路面故障信息上报系统设计与实现
  • rabbitmq服务端消费端实例(direct和fanout模式)
  • 橙色车队上的安全密码:嘉顺达蓝海的危险品运输专业之道
  • FPGA高频面试问题整理—附答案
  • html框架做网站创立个网站专业卖手机
  • 【设计模式】单例模式(Singleton)
  • 2025.10.18 TRAE HACKATHON WUHAN 黑客马拉松在武汉隆重举行[特殊字符]
  • php5 mysql网站开发实例精讲东莞保安公司联系电话
  • 怎么加入网站做微商城深圳广告设计与制作公司
  • App 上架 iOS 全流程指南,开发签名、IPA 上传与使用 开心上架 跨平台自动化上架实践
  • Learning Depth Estimation for Transparent and Mirror Surfaces
  • 基于知识图谱的智能会议纪要系统:从语音识别到深度理解
  • 网络通信中的POE PD详解:从核心概念到芯片选型指南
  • TensorFlow2 Python深度学习 - 生成对抗网络(GAN)实例
  • 利用jmeter完成简单的压力测试
  • 做网站用什么编程软件黄页88网能不能发免费的广告
  • 电子商务网站开发合同网页设计基础教程第二版课后答案
  • 基于Vite创建一个Vue2
  • 小皮面板的MySQL点击启动后马上又停止了
  • 【Python入门】第5篇:数据结构初探(列表、元组、字典、集合)​
  • Redis的List数据结构底层实现