刷题 双指针 滑动窗口

news2024/10/10 20:35:47

面试经典 150 题 - 双指针

125. 验证回文串⭐️

在这里插入图片描述
学会内部字母处理函数的使用

class Solution {
public:
    bool isPalindrome(string s) {
        int left = 0, right = s.size() - 1;
        while (left <= right) {
            // 处理左边字符
            if (!isalnum(s[left])) {
                ++left;
                continue;
            }
            // 处理右边字符
            if (!isalnum(s[right])) {
                --right;
                continue;
            }
            // 忽略大小写后比较字符
            if (tolower(s[left]) != tolower(s[right])) {
                return false;
            }
            ++left;
            --right;
        }
        return true;
    }
};

392. 判断子序列 - 贪心

在这里插入图片描述

class Solution {
public:
    // 双指针
    bool isSubsequence(string s, string t) {
        int i = 0;
        for (int j = 0; i < s.size() && j < t.size(); ++j) {
            if (s[i] == t[j]) {
                ++i;
            }
        }
        return (i == s.size());
    }
};

167. 两数之和 II - 输入有序数组 - 双向双指针

在这里插入图片描述

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        int left = 0, right = numbers.size() - 1;
        while(left < right) {
            int sum = numbers[left] + numbers[right];
            if (sum > target) --right;
            else if (sum < target) ++left;
            else return {left + 1, right + 1};
        }
        return {-1, -1};
    }
};

11. 盛最多水的容器⭐️

在这里插入图片描述

class Solution {
public:
    int maxArea(vector<int>& height) {
        int ans = 0, n = height.size();
        for (int l = 0, r = n - 1; l < r;) {
            ans = max(ans, min(height[l], height[r]) * (r - l));
            // 移动较长边:面积一定缩小
            // 移动较短边: 面积有可能变大
            if (height[l] < height[r]) {
                ++l; 
            } else {
                --r;
            }
        }
        return ans; 
    }
};

15. 三数之和 - 双向双指针

在这里插入图片描述

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> result;
        int n = nums.size();
        sort(nums.begin(), nums.end());
        for (int i = 0; i < n - 2; ++i) {
            while (i > 0 && i < n - 2 && nums[i] == nums[i - 1]) {
                ++i;
            }
            if (nums[i] > 0) {
                break;
            }
            for (int j = i + 1, k = n - 1; j < k;) {
                if (nums[k] < 0) {
                    break;
                }
                int sum = nums[i] + nums[j] + nums[k];
                if (sum < 0) {
                    ++j;
                } else if (sum > 0) {
                    --k;
                } else {
                    result.push_back({nums[i], nums[j], nums[k]});
                    ++j;
                    --k;
                    while (j < k && nums[j] == nums[j - 1]) {
                        ++j;
                    }
                    // while (k > j && nums[k] == nums[k - 1]) {
                    //     --k;
                    // }
                }
            }
        }
        return result;
    }
};

面试经典 150 题 - 滑动窗口

209. 长度最小的子数组

在这里插入图片描述

class Solution {
public:
    // 题目要求:总和大于等于 target 的长度最小的 子数组
    // 当找到窗口总和 大于等于 target,记录窗口宽度,再从左侧缩小窗口直至小于 target
    int minSubArrayLen(int target, vector<int>& nums) {
        int sum = 0;
        size_t ans = INT_MAX;
        for (size_t left = 0, right = 0; right < nums.size(); ++right) {
            sum += nums[right];
            while (sum >= target) {
                ans = min(ans, right - left + 1);
                sum -= nums[left];
                ++left;
            }
        }
        return ((ans == INT_MAX) ? 0 : ans);
    }
};

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

在这里插入图片描述

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        size_t ans = 0;
        array<char, 128> hash = {0};    // 包含所有 ASCII 码
        for (size_t left = 0, right = 0; right < s.size(); ++right) {
            while (hash[s[right]] == 1) {
                --hash[s[left]];
                ++left;
            }
            ++hash[s[right]];
            ans = max(ans, right - left + 1);
        }
        return ans;
    }
};

30. 串联所有单词的子串⭐️⭐️⭐️⭐️⭐️ - 分组滑动窗口

在这里插入图片描述

class Solution {
public:
    // 题目的特别之处:words 中所有字符串的长度都相同
    // 那我们是不是可以先获得子串的长度
    // 暴力解法: 根据 子串长度 * 单词表的大小 截取来做匹配
    // 复杂度: O(n * m)

    // 如何优化?分组滑动窗口 --> 分成 m 组
    // eg. barfoothefoobarman
    //      i = 0   [bar][foo][the][foo][bar][man]
    //      i = 1   b[arf][oot][hef][oob][arm]an
    //      i = 2   ba[rfo][oth][efo][oba][rma]n
    vector<int> findSubstring(string s, vector<string>& words) {
        size_t n = words.size(), m = words[0].size(), total_len = m * n;
        if (total_len > s.size()) return vector<int>{};
        unordered_map<string, int> word_count;
        vector<int> ans;
        for (auto& word : words) {
            word_count[word]++;
        }
        for (size_t i = 0; i < m; ++i) {    
            unordered_map<string, int> window_count;
            int words_used = 0;
            for (size_t left = i, right = i; right + m <= s.size(); right += m) {
                string word = s.substr(right, m);
                if (word_count.find(word) != word_count.end()) {
                    // 单词存在
                    window_count[word]++;
                    words_used++;
                    // 检测单词频率是否超过限制
                    while (window_count[word] > word_count[word]) {
                        window_count[s.substr(left, m)]--;
                        words_used--;
                        left += m;
                    }
                    if (words_used == n) {
                        ans.push_back(left);
                    }
                } else {
                    // 出现不存在的单词,直接清空重新开始即可
                    window_count.clear();
                    words_used = 0;
                    left = right + m;   // 将left移动到下一个位置
                }
            }
        }
        return ans;
    }
};

76. 最小覆盖子串⭐️⭐️⭐️⭐️⭐️

在这里插入图片描述


// 用时:35:57
// 主要 bug: 把 win_char_counts[s[left]]等 写成 win_char_counts[left]
// 超出内存限制:把每次记录的 ans = s.substr(left, min_len) 改成记录 start_idx
//              最终输出结果的时候才执行 substr,减少内存操作

class Solution {
public:
    string minWindow(string s, string t) {
        if (s.size() < t.size()) return "";
        int min_len = INT_MAX, start_idx = 0;
        unordered_map<char, int> t_char_counts;
        for (auto& ch : t) {
            t_char_counts[ch]++;
        }
        size_t covered_count = 0;   // 记录已经覆盖多少t中字符了
        unordered_map<char, int> win_char_counts;
        for (size_t left = 0, right = 0; right < s.size(); right++) {
            if (t_char_counts.find(s[right]) != t_char_counts.end()) {
                // 当前字符是在 t 中存在,更新出现的频次
                win_char_counts[s[right]]++;
                if (win_char_counts[s[right]] <= t_char_counts[s[right]]) {
                    // 只有当频次小于等于 t 中出现的频次时才更新 覆盖字符数
                    // 因为多了的话也用不上,最多只用得上 t_char_counts[right] 这么多
                    covered_count++;
                }
                while (covered_count == t.size()) {   // 为什么是while,因为每次更新left之后都需要更新 min_len 和 ans
                    // 找到覆盖子串,更新结果并移动 left 直至恰好不满足
                    if (right - left + 1 < min_len) {
                        min_len = right - left + 1;
                        start_idx = left;
                    }
                    // 移动 left
                    if (t_char_counts.find(s[left]) != t_char_counts.end()) {
                        if (win_char_counts[s[left]] <= t_char_counts[s[left]]) {
                            covered_count--;
                        }
                        win_char_counts[s[left]]--;
                    }
                    ++left;
                }
            }
        }
        return ((min_len == INT_MAX) ? "" : s.substr(start_idx, min_len));
    }
};

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

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

相关文章

2024 kali虚拟机安装教程,分两大步骤,图文讲解(1)

第二步链接&#xff1a; 2024 kali虚拟机安装教程&#xff0c;分两大步骤&#xff0c;图文讲解&#xff08;2&#xff09;-CSDN博客 准备工作 1.kali的iso镜像文件 2.VMware Workstation Pro 虚拟机软件 正式开始 1.创建新的虚拟机&#xff0c;勾选自定义&#xff08;高级…

King3399(ubuntu文件系统)风扇驱动

该文章仅供参考&#xff0c;编写人不对任何实验设备、人员及测量结果负责&#xff01;&#xff01;&#xff01; 0 引言 文章主要介绍King3399&#xff08;ubuntu文件系统&#xff09;风扇控制&#xff08;GPIO&#xff09;&#xff0c;涉及king-rk3399.dts设备树修改&#x…

职场人情世故,你一定要学

职场上工作固然是第一位&#xff0c;但看似平淡的人际关系的经营&#xff0c;是对工作的顺利展开有重要的辅助作用&#xff0c;人来人往&#xff0c;这几条处事你必须要懂&#xff0c;否则职场上升职、加薪会吃亏。 1、 看破不拆穿。 职场上你要活的很通透的人&#xff0c;对什…

从 Reno TCP 到 Scalable TCP,HighSpeed TCP

前文 Scalable TCP 如何优化长肥管道 介绍了 Scalable TCP&#xff0c;但联系另一个类似的算法 HighSpeed TCP(简称 HSTCP)&#xff0c;就会看到一个类似从 Reno TCP 经 BIC 到 CUBIC 的路线&#xff0c;但采用了不同的策略。 Reno TCP 经 BIC 到 CUBIC 路线的核心在于 “在长…

2024年最新(AI绘画)Stable Diffusion4.9下载及安装教程.

软件介绍 Stable Diffusion 是一款在图像生成领域具有重大影响力的软件。 从工作原理上看&#xff0c;它利用深度学习的先进算法&#xff0c;构建起复杂且强大的神经网络架构。其核心在于能够解读用户输入的文本信息&#xff0c;并将这些信息转化为图像的特征与细节。 在使用…

游戏出海:跨境卖家入驻G2A详细操作指南

《黑悟空神话》在海外爆火&#xff0c;游戏出海也成为了众多游戏开发商的热门选择。在这个趋势之下&#xff0c;G2A&#xff0c;这个专注于游戏出海的电商平台&#xff0c;凭借庞大的用户群体&#xff0c;为游戏卖家提供了一个触达全球玩家的绝佳平台。 对于想要拓展海外市场的…

【HTML】制作一个简易图片轮播器

1. 轮播器效果图 1. 正常状态下每 1.5秒 自动轮播下张图片&#xff0c;轮播结束从头开始重复 2. 鼠标悬停时停止轮播&#xff0c;可以选择左右图片切换 2. HTML 结构 文档类型声明&#xff1a;<!DOCTYPE html> 声明文档类型为HTML5。HTML标签&#xff1a;<html lang…

2024 闽盾杯-黑盾赛道WP

CRYPTO 签到题-学会SM https://www.json.cn/encrypt/sm3 题目要求小写所以需要转换一下 或者脚本&#xff1a; import hashlib message "heidun2024" hash_object hashlib.new(sm3) hash_object.update(message.encode(utf-8)) hash_value hash_object.hexdigest(…

【STM32单片机_(HAL库)】4-5-3【定时器TIM】【感应开关盖垃圾桶项目】项目实现

1.项目需求 以下几个事件触发时&#xff0c;垃圾桶自动开盖&#xff0c;并伴随蜂鸣器短响一声&#xff0c;同时 LED 灯闪烁一下&#xff0c;2秒后自动关盖&#xff1a; 检测到有人靠近检测到有震动按下按键 KEY1 2.硬件 STM32单片机最小系统震动传感器模块蜂鸣器模块&#…

对象比较工具类:实现对业务的修改记录保存(对象字段差异对比)

测试 1&#xff1a;User类 Data NoArgsConstructor AllArgsConstructor public class User {FieldLabel("姓名")private String name;FieldLabel("年龄")private Integer age;FieldLabel("手机")private String phone;FieldLabel("手机号…

宠物空气净化器哪个牌子吸毛好?希喂、IAM、352真实测评

前段时间忙活了个大工程——热门宠物空气净化器大横评&#xff0c;通过多方位的测试&#xff0c;帮助不少朋友解决了宠物空气净化器的选购难题。 但我们还不局限于此&#xff0c;在从事家电行业这些年间&#xff0c;我们还花费大价钱购置一堆产品实测体验过各类大小家电产品&a…

Spring Boot教学资源库:从入门到精通

1绪 论 1.1研究背景 目前&#xff0c;在网络大环境下&#xff0c;越来越多高校开始实行网络教学&#xff0c;利用网络教学方式有利于学生更好的学习。 网络教学是指以计算机及网络为基础&#xff0c;来实现教学资源的上传、存储、传播和共享的教学手段。它是一种教学活动&#…

PyQt5 基于paho-mqtt库 实现MQTT通信

PyQt5 基于paho-mqtt库 实现MQTT通信 paho-mqtt安装paho-mqtt库综合示例错误处理 paho-mqtt paho-mqtt官网文档 安装paho-mqtt库 pip install paho-mqtt 综合示例 封装MQTT类订阅消息发布消息信号方式接收处理MQTT消息 import paho.mqtt.client as mqtt import sys import …

在线绘图工具drawio,visio的平替

Draw.io&#xff1a;灵活高效的在线绘图工具推荐 在工作和项目管理中&#xff0c;流程图、架构图和思维导图等可视化图表是非常重要的沟通工具。Draw.io&#xff08;现更名为diagrams.net&#xff09;是一个强大且免费的在线绘图工具&#xff0c;适用于创建各种类型的图表。它功…

YOLOv11训练自己的数据集,YOLOv11网络解析

1 训练自己的数据集 在github搜索ultralytics并下载。 GitHub - ultralytics/ultralytics: Ultralytics YOLO11 &#x1f680; 环境配置不再赘述&#xff0c;本地配置自行搜索教程&#xff0c;若使用云服务器配置更为简单。 数据标注 pip install labelimg启动标注工具 la…

【PGCCC】在 Postgres 上构建图像搜索引擎

我最近看到的最有趣的电子商务功能之一是能够搜索与我手机上的图片相似的产品。例如&#xff0c;我可以拍一双鞋或其他产品的照片&#xff0c;然后搜索产品目录以查找类似商品。使用这样的功能可以是一个相当简单的项目&#xff0c;只要有合适的工具。如果我们可以将问题定义为…

Pycharm设置相同变量的背景颜色

在 PyCharm 中设置鼠标点击某个变量时&#xff0c;代码其他地方相同变量的背景颜色&#xff0c;可以通过调整颜色方案中的相关设置来实现。以下是详细步骤&#xff1a; 打开 PyCharm&#xff0c;选择 File -> Settings&#xff08;在 Windows/Linux 上&#xff09;或 PyChar…

基于 CSS Grid 的简易拖拉拽 Vue3 组件,从代码到NPM发布(1)- 拖拉拽交互

基于特定的应用场景&#xff0c;需要在页面中以网格的方式&#xff0c;实现目标组件在网格中可以进行拖拉拽、修改大小等交互。本章开始分享如何一步步从代码设计&#xff0c;最后到如何在 NPM 上发布。 请大家动动小手&#xff0c;给我一个免费的 Star 吧~ 大家如果发现了 Bug…

全网最详细k8s搭建部署

目录 Kubernetes的功能&#xff1a; Kubernetes的特点&#xff1a; 1. 安装要求 2. 部署内容 1、系统环境准备 2、所有禁用swap和本地解析 3、仓库配置&#xff0c;所有安装docker 4、所有节点设定docker的资源管理模式为systemd 5、所有阶段复制harbor仓库中的证书并…

一款电子产品图册转换器

​随着科技的不断发展&#xff0c;电子产品已经成为我们生活中不可或缺的一部分。无论是手机、平板电脑还是智能家居&#xff0c;它们都离不开电子图册的支撑。一款优秀的电子产品图册转换器&#xff0c;可以帮助我们轻松实现电子图册的转换&#xff0c;为我们的生活和工作带来…