首页 > 其他分享 >LeetCode刷题笔记8.19-8.24

LeetCode刷题笔记8.19-8.24

时间:2024-08-26 11:39:48浏览次数:12  
标签:right 窗口 Sites 8.24 遍历 8.19 key LeetCode left

LeetCode刷题笔记8.19-8.24

76.最小覆盖子串(8.19)

算法常见技巧——滑动窗口

  1. 滑动窗口即维护一个窗口(特定数据结构),来替代暴力遍历子结构这种“笨办法”
  2. 窗口所涉及到的元素由left和right两个指针选定,选定范围从(left,right]开始,随着right指针向后遍历,寻找符合题意的某个可行解(指针遍历过程中来更新标记变量,进而判断是否达到可行性)left向后遍历则是在达到可行条件后优化该解,前提是将当前可行解记录下来。
  3. 该技巧涉及到的几个coder需要考虑的点:
  • 什么时候应该移动 right 扩大窗口?
  • 窗口加入字符时,应该更新哪些标记变量?(目的是接近题意可行解)
  • 什么时候窗口应该暂停扩大,开始移动 left 缩小窗口?
    (该问题一般回答是 当寻找到一个可行解后)
  • 我们要的结果应该在扩大窗口时还是缩小窗口时进行更新?
    (在收缩窗口时更新最终结果)
  1. 滑动窗口大致框架:
void slidingWindow(String s) {
    // 用合适的数据结构记录窗口中的数据,根据具体场景变通
    // 比如说,我想记录窗口中元素出现的次数,就用 map
    // 如果我想记录窗口中的元素和,就可以只用一个 int
    Object window = ...
    
    int left = 0, right = 0;
    while (right < s.length()) {
        // c 是将移入窗口的字符
        char c = s[right];
        window.add(c)
        // 增大窗口
        right++;
        // 进行窗口内数据的一系列更新
        ...

        // *** debug 输出的位置 ***
        // 注意在最终的解法代码中不要 print
        // 因为 IO 操作很耗时,可能导致超时
        printf("window: [%d, %d)\n", left, right);
        // ***********************
        
        // 判断左侧窗口是否要收缩
        while (left < right && window needs shrink) {
            // d 是将移出窗口的字符
            char d = s[left];
            window.remove(d)
            // 缩小窗口
            left++;
            // 进行窗口内数据的一系列更新
            ...(与扩大窗口时的操作对称)
        }
    }
}

【针对这道题】:

  1. 关于hashMap:
    1)HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类,基本类型对应的包装类表如下:
    | 基本类型 | 引用类型 |
    | boolean | Boolean |
    | byte | Byte |
    | short | Short |
    | int | Integer |
    | long | Long |
    | char | Character |
    2)向hashmap中插入一条记录 put(key,value);
// 创建 HashMap 对象 Sites
HashMap<Integer, String> Sites = new HashMap<Integer, String>();
// 添加键值对
Sites.put(1, "Google");

3)从hashmap中取出一条记录 get(key);
System.out.println(Sites.get(3));
4)删除hashmap中的某一条记录 remove(key)

Sites.remove(4);
System.out.println(Sites);

5)计算 HashMap 中的元素数量可以使用 size() 方法
6) 如果只想获取 key,可以使用 keySet() 方法,返回所有key,相同的类型可以使用for-each来遍历;可以通过 get(key) 获取对应的 value,如果你只想获取 value,可以使用 values()
5. getOrDefault() 方法获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值hashmap.getOrDefault(Object key, V defaultValue);

567. 字符串的排列(8.21)

  1. 经过这两道题总结出了滑动窗口应用的规律:
  • 题目中要求在大部分中遍历搜索小部分的情况
  • 题目中对小部分的长度/元素限制(隐含的词语修饰例如:“子串”、“排列”、“最长最短子串”、“元素和最大最小”)
  • 题目中的要求对应上面所提到的模板应用中需要考虑的几个边界条件

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

  1. 这道题与上面两道题有一个判断条件存在差别:
  • 移动left指针的时机并非在刚好满足题意时,而是在子串中一旦存在重复字符时将字符清除
  • 相应地在更新统计变量时应该是在left移动过后,产生暂时的可行解时更新

标签:right,窗口,Sites,8.24,遍历,8.19,key,LeetCode,left
From: https://www.cnblogs.com/Wyuf1314/p/18367584

相关文章

  • LeetCode 690. 员工的重要性(哈希表、深度优先搜索dfs)
    题目:690.员工的重要性思路:先用哈希表map将每个员工的信息映射到员工ID对应的下标位置。接着使用深度优先搜索dfs,来记录总和即可。细节看注释/*//DefinitionforEmployee.classEmployee{public:intid;intimportance;vector<int>subordinates;......
  • 上周热点回顾(8.19-8.25)
    热点随笔:· 会员力量:非常感谢58位园友成为终身会员 (博客园团队)· 【故障公告】博客站点遭遇大规模DDoS攻击 (博客园团队)· 使用FModel提取《黑神话:悟空》的资产 (paw5zx)· 寻访中国100家.NET中大企业——第二站:苏州行 (一线码农)· 花了一天时间帮财务朋友开发......
  • Java | Leetcode Java题解之第374题猜数字大小
    题目:题解:publicclassSolutionextendsGuessGame{publicintguessNumber(intn){intleft=1,right=n;while(left<right){//循环直至区间左右端点相同intmid=left+(right-left)/2;//防止计算时溢出......
  • 8.24~8.30 校内集训日志
    8.24模拟赛2024--梦熊&太戈--NOIP十三连测#6【订正】-比赛-梦熊联盟(mna.wang)A.Alice的数有显然的\(80\)分。但是还是用两个小时冲到了\(100\)分。做法比std复杂。\(100+100+100\)。题意令\(y^2\)是距离\(x\)最近的完全平方数,若有不止一个最近的直接输......
  • 数据结构:189(轮转数组)leetcode(OJ)
    给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[5,6,7,1,2,3,4]示例 2:输入:n......
  • Leetcode面试经典150题-72.编辑距离
    解法都在代码里,不懂就留言或者私信动态规划最经典题之一,如果写不出来,动态规划好好再学学classSolution{/**这个题是动态规划最经典的题,另一个最经典的是背包问题*/publicintminDistance(Stringword1,Stringword2){/**如果一个为0,取另外一个的长......
  • 学习笔记 韩顺平 零基础30天学会Java(2024.8.24)
    P532Map接口特点2P533Map接口方法P534Map六大遍历方式     方法一:通过KeySet(),取出所有的Key,把取出的Key放到Set中,再通过Key取出对应的Value                 到这里又有两种方式遍历Set:迭代器、增强for     方法二:通过values(),取出......
  • 2024.8.24
    DATE#:20240824ITEM#:DOCWEEK#:SATURDAYDAIL#:捌月廿壹TAGS<BGM="风屿--闫东炜"><theme=oi-graphtheory><[NULL]><[空]><[空]>```与风为名,屿之齐鸣。——风屿```LGV引理LGV引理,全称Lindstrom-Gessel-Viennotlemma用于求解D......
  • 8.24日周记
    Java学习一.数组的静态初始化/*完整格式:数据类型[]数组名=new数据类型[]{元素1,元素2,元素3,元素4...};/int[]arr=newint[]{11,22,33};double[]arr=newdouble[]{1.1,1.2,1.3};/简化格式:数据类型[]数组名={元素1,元素2,元素3,元素4...};/int[]array={1,2,3......
  • 8.24--学习JAVA语言
    在编程中,流程控制是实现逻辑和功能的核心。Java,作为一种广泛使用的面向对象编程语言,提供了多种流程控制结构,帮助开发者实现复杂逻辑。顺序结构是程序中最基本的流程控制结构,按照代码出现的顺序依次执行。例如:选择结构允许程序根据条件选择不同的执行路径。Java提供了if语句和swi......