Leetcode刷题——7 滑动窗口 双指针

注:以下代码均为c++

1. 两数之和2(输入有序数组)

在这里插入图片描述
在这里插入图片描述

// 法1:暴力
vector<int> twoSum1(vector<int>& numbers, int target) {
    vector<int> ans(2);
    int n = numbers.size();
    for(int i = 0; i < n-1; i++){
        if(i != 0 && numbers[i] == numbers[i-1])
            continue;
        for(int j = i + 1; j < n; j++){
            if(numbers[i] + numbers[j] == target){
                //ans[0] = i + 1, ans[1] = j + 1;
                //return ans;
                return {i + 1, j + 1};  //注意:这里可以直接这么写,不需要再建立一个vector返回
            }
        }
    }
    return {-1, -1};
}

暴力(O(n^2)) =》单调性 =》优化:双指针(O(n))
请添加图片描述

// 法2:双指针
vector<int> twoSum(vector<int>& numbers, int target){
    int n = numbers.size();
    for(int i = 0, j = n - 1; i < n-1; i++){
        while(numbers[i] + numbers[j] > target)
            j--;
        if(numbers[i] + numbers[j] == target)
            return {i + 1, j + 1};
    }
    return {-1, -1};
}

2. 合并两个有序数组

在这里插入图片描述
在这里插入图片描述
法1:新建一个数组存nums1,从前往后依次遍历。

void merge1(vector<int>& nums1, int m, vector<int>& nums2, int n) {
    vector<int> nums11(m);
    copy(nums1.begin(), nums1.begin() + m,nums11.begin());
    int i, j, k;
    for(i = 0, j = 0, k = 0; i < m && j < n; k++){
        if(nums11[i] <= nums2[j]){
            nums1[k] = nums11[i];
            i++;
        }
        else{
            nums1[k] = nums2[j];
            j++;
        }
    }
    while(i < m){
        nums1[k] = nums11[i];
        i++, k++;
    }
    while(j < n){
        nums1[k] = nums2[j];
        j++, k++;
    }
}

法2:不需要新建数组,直接在原数组上遍历,从后向前遍历。找到nums1和nums2中的较大数,添加到nums1末尾。
在这里插入图片描述

void merge(vector<int>& nums1, int m, vector<int>& nums2, int n){
    int i, j, k;
    for(i = m-1, j = n-1, k = m+n-1; i >= 0 && j >= 0; k--){
        if(nums1[i] > nums2[j]){
            nums1[k] = nums1[i];
            i--;
        }
        else{
            nums1[k] = nums2[j];
            j--;
        }
    }
    while(j >= 0){
        nums1[k] = nums2[j];
        k--, j--;
    }
}

3. 最小覆盖子串

在这里插入图片描述
在这里插入图片描述
法1:暴力穷举:在s中从头找所有比 t 长的字符串
法2:滑动窗口
请添加图片描述

string minWindow2(string s, string t){
    unordered_map<char, int> hash;  //每个元素缺多少
    for(auto c : t)
        hash[c]++;
    int cnt = hash.size();  //下面for循环中,c表示已经匹配的哈希表元素个数
    string res;  //存结果
    //i为右指针,j为左指针
    for(int i = 0, j = 0, c = 0; i < s.size(); i++){  //右指针一直向右移动,不回头
        if(hash[s[i]] == 1)  //找到了s[i]在哈希表内,且该元素正好缺一个:该元素完全匹配c++
            c++;
        hash[s[i]]--;
        
        //左指针右移
        while(hash[s[j]] < 0)  //s[j]多了,=0的时候正好
            hash[s[j++]]++;  //先将缺的hash值+1,再左指针右移
            
        if(c == cnt)  //都匹配了
            if(res.empty() || res.size() > i-j+1)
                res = s.substr(j, i-j+1);
    }
    return res;
}

4. 最长有效括号

在这里插入图片描述
在这里插入图片描述

int work(string s){
    int res = 0;
    for(int i = 0, start = 0, cnt = 0; i < s.size(); i++){  //start记录起始位置,i从前往后遍历一遍
        if(s[i] == '(')
            cnt++;
        else{
            cnt--;
            if(cnt < 0){
                start = i + 1;
                cnt = 0;
            }
            else if(cnt == 0)
                res = max(res, i - start + 1);
        }
    }
    return res;
}
int longestValidParentheses(string s) {
    int res = work(s);
    reverse(s.begin(), s.end());
    for(auto &c: s)  //将'('转换为')',将')'转换为'('
        c = c ^ 1;  //查ascii码发现'('与')'的二进制只差1,也就是说最后一位一个是0一个是1,所以可以用异或操作来将0变成1,将1变成0,从而实现'('到')'的反转
    res = max(res, work(s));
    return res;
}

5. 最小栈

在这里插入图片描述
在这里插入图片描述
本质:求最小前缀。用一个栈保存当前最小值。

class MinStack{
public:
    stack<int> stk, stk_min;
    MinStack(){
    }
    void push(int val){
        stk.push(val);
        if(stk_min.empty())    stk_min.push(val);
        else stk_min.push(min(val, stk_min.top()));
    }
    void pop(){
        stk.pop();
        stk_min.pop();
    }
    int top(){
        return stk.top();
    }
    int getMin(){
        return stk_min.top();
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVA之开发神器——IntelliJ IDEA的下载与安装

一、IDEA是什么&#xff1f; IEAD是JetBrains公司开发的专用于java开发的一款集成开发环境。由于其功能强大且符合人体工程学&#xff08;就是更懂你&#xff09;的优点&#xff0c;深受java开发人员的喜爱。目前在java开发工具中占比3/4。如果你要走java开发方向&#xff0c;那…

C++ 帕斯卡三角形(Pascal’s Triangle)

帕斯卡三角形是二项式系数的三角形阵列。编写一个函数&#xff0c;以整数值N作为输入&#xff0c;并打印帕斯卡三角形的前N​​行。 例子&#xff1a; 下图显示了 N6 的帕斯卡三角形 使用二项式系数的帕斯卡三角形&#xff1a; 每行的条目数等于行号。例如&#xff…

基因检测3 - 遗传性耳聋

1. 耳聋简介 在每1000个新生儿中有1-3个耳聋患儿&#xff0c;绝大部分为遗传学耳聋。遗传性耳聋疾病的遗传方式包括常染色体隐性遗传、常染色体显性遗传、线粒体遗传以及伴性遗传。 根据遗传性耳聋除听力损失外是否存在其他表型&#xff0c;将耳聋分为综合征型耳聋 &#xff…

网页视频提取在线工具

在互联网的海洋中&#xff0c;我们时常会遇到一些令人心动的视频&#xff0c;想要将其下载到本地&#xff0c;以便随时观看。然而&#xff0c;网页视频下载对于很多人来说&#xff0c;似乎是个复杂的过程。别担心&#xff0c;今天我就为大家带来一份详尽的网页视频下载教程&…

79 单词搜索

题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻的单元格内的字母构成&#xff0c;其中“相邻”单元格是那些水平相邻或…

捷配PCB 6个PCB板材关键参数解读技巧

PCB板材是指覆铜基板&#xff0c;是制造电路板的最主要材料。 板材的一些关键性能参数对电路板的生产加工、元器件贴装焊接、电子产品的功能实现以及产品的使用环境或寿命等都将产生一定程度的影响&#xff0c;所以掌握板材的关键参数在实际应用中非常有必要。 PCB板材的关键性…

数据融合工具(5)面中心线提取

这是一个重磅工具&#xff0c;建议先看视频。 提取中心线 一、需求背景 说真的&#xff0c;当小编第一次使用ArcGIS中的Polygon To Centerline工具提取面要素中心线时&#xff0c;激动得无以言表&#xff0c;毕竟&#xff0c;以前要提取面中心线&#xff0c;是一件非常麻烦的事…

完美解决ImportError: cannot import name ‘idnadata‘的正确解决方法,亲测有效!!!

完美解决ImportError: cannot import name idnadata’的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01; 亲测有效 完美解决ImportError: cannot import name idnadata的正确解决方法&#xff0c;亲测有效&#xff01;&#xff01;&#xff01;报错问题…

python parser.add_argument

7->prefix_chars&#xff1a;前缀可选参数的字符集(默认值:’ - ) import argparseparser argparse.ArgumentParser(descriptionTesting...) #创建对象parser.add_argument(test,typeint) ##添加单个命令参数 parser.add_argument(test_1,typefloat) ##type是输入的指定类型…

为什么要安装HTTPS证书?

安装HTTPS证书对于确保网站数据的安全性、增强用户信任度、提升品牌形象和优化搜索引擎排名至关重要。在互联网时代&#xff0c;信息传输的安全性和隐私保护已成为公众和企业最为关注的问题之一。HTTPS证书的引入&#xff0c;正是为了解决这些问题&#xff0c;为网站和用户提供…

MySQL之基本查询(上)-表的增删查改

目录 Create(创建) 案例建表 插入 单行数据 指定列插入 单行数据 全列插入 多行数据 全列插入 插入是否更新 插入时更新 替换 Retrieve(读取) 建表插入 select列 全列查询 指定列查询 查询字段为表达式 为查询结果指定别名 结果去重 where条件 比较运算符 逻辑运…

Greenplum(三)【分布式事务和两阶段提交协议】

1、事务实现原理和 WAL&#xff08;单机&#xff09; 属性含义数据库系统实现Atomic&#xff08;原子性&#xff09;事务中的操作要么全部正确执行&#xff0c;要么完全不执行&#xff08;要么成功、要么失败&#xff09;Write Ahead Logging 预写日志&#xff0c;分布式事务&…

Canvas:掌握图像变换合成与裁剪状态像素操作

想象一下&#xff0c;用几行代码就能创造出如此逼真的图像和动画&#xff0c;仿佛将艺术与科技完美融合&#xff0c;前端开发的Canvas技术正是这个数字化时代中最具魔力的一环&#xff0c;它不仅仅是网页的一部分&#xff0c;更是一个无限创意的画布&#xff0c;一个让你的想象…

LabVIEW优化氢燃料电池

太阳能和风能的发展引入了许多新的能量储存方法。随着科技的发展&#xff0c;能源储存和需求平衡的方法也需要不断创新。智慧城市倡导放弃石化化合物&#xff0c;采用环境友好的发电和储能技术。氢气系统和储存链在绿色能源倡议中起着关键作用。然而&#xff0c;氢气密度低&…

git为文件添加可执行权限

查看文件权限 git ls-files --stage .\SecretFinder.py100644 表示文件的所有者有读取和写入权限 添加可执行权限 git update-index --chmod x .\SecretFinder.py再次查看文件权限 git ls-files --stage .\SecretFinder.py100755 表示文件的所有者有读取、写入和执行权限

记录|C#安装+HslCommunication安装

记录线索 前言一、C#安装1.社区版下载2.VS2022界面设置 二、HslCommunication安装1.前提2.安装3.相关文件【重点】 更新记录 前言 初心是为了下次到新的电脑上安装VS2022做C#上机位项目时能快速安装成功。 一、C#安装 1.社区版下载 Step1. 直接点击VS2022&#xff0c;跳转下…

Python基于you-get下载网页上的视频

​ 1.python 下载地址 下载 : https://www.python.org/downloads/ 2. 配置环境变量 配置 python_home 地址 配置 python_scripts 地址 在path 中加入对应配置 3. 验证 ​ C:\Users>python --version Python 3.12.4C:\Users>wheel version wheel 0.43.04. 下载 c…

JS之防抖和节流

防抖 (debounce) 所谓防抖&#xff0c;就是指触发事件后在 n 秒内函数只能执行一次&#xff0c;如果在 n 秒内又触发了事件&#xff0c;则会重新计算函数执行时间。 ps: 重置普攻&#xff0c;百度翻译要输完停止一定时间后才翻译。 没有防抖和节流的缺点&#xff1a; 函数触发…

一天20MW!天途推出无人机全自主光伏巡检平台

01 光伏电站的运维挑战 光伏发电为人类提供了可持续的清洁能源供给。一般集中式电站建设在空旷的地区&#xff0c;如荒地、沙漠等地区&#xff1b;分布式电站建设在用户的屋顶和建筑物表面&#xff0c;如住宅、商业建筑、工业厂房等地区。 随着光伏电站的大规模的使用&#x…

解决:WPS,在一个表格中,按多次换行,无法换到下一页

现象&#xff1a;在一个表格里面&#xff0c;多次按下回车&#xff0c;始终无法到下一页 解决方法&#xff1a;右击—>表格属性—>选择行—>勾选 允许跨页断行 效果演示 对比展示