Leedcode刷题——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/788317.html

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

相关文章

预算有限?如何挑选经济适用的安全管理系统?

如今&#xff0c;无论是信息安全、生产安全还是人员安全&#xff0c;都直接关系到企业的稳定运营和长远发展。然而&#xff0c;对于许多中小企业而言&#xff0c;高昂的安全管理系统投入往往成为一大难题。那么&#xff0c;在预算有限的情况下&#xff0c;如何挑选一款既经济适…

Camera Raw:常规工具

在 Camera Raw 窗口右下角提供了四个常用的工具&#xff0c;它们分别是&#xff1a;缩放工具、抓手工具、切换取样器叠加以及切换网格叠加工具。 ◆ ◆ ◆ 缩放工具 Zoom Tool 用于放大或缩小预览图像&#xff0c;便于查看和编辑细节。 快捷键&#xff1a;Z 1、双击“缩放工具…

瓦罗兰特游戏帧数低怎么办 瓦罗兰特游戏帧率提不上去怎么解决

瓦罗兰特是一款由拳头游戏&#xff08;Riot Games&#xff09;开发的5v5英雄射击游戏。结合了MOBA元素&#xff0c;每个角色都拥有四个独特的技能&#xff1b;提供了多种游戏模式&#xff0c;如5V5战术射击等&#xff1b;角色和皮肤设计丰富。游戏中&#xff0c;玩家将扮演各具…

uniapp 表格,动态表头表格封装渲染

1.接口表格数据&#xff1a; {"headers": [{"label": "实例名","name": "v1","order": 1,"hide": false,"dateTypeValue": null},{"label": "所属科室","name&quo…

MATLAB数据统计描述和分析

描述性统计就是搜集、整理、加工和分析统计数据&#xff0c; 使之系统化、条理化&#xff0c;以显示出数据资料的趋势、特征和数量关系。它是统计推断的基础&#xff0c;实用性较强&#xff0c;在数学建模的数据描述部分经常使用。 目录 1.频数表和直方图 2 .统计量 3.统计…

Tensorflow之损失函数与交叉熵

损失函数&#xff1a;预测值与已知答案之间的差距 NN优化目标&#xff1a;loss最小{mse&#xff0c; 自定义&#xff0c; ce) 均方误差tensorflow实现&#xff0c;loss_mse tf.reduce_mean(tf.sqrue(y_-y) 预测酸奶日销量&#xff0c;y&#xff0c;x1, x2是影响日销量的因素…

掌握三菱Q系列QD75运动控制模块

跟着资深三菱电气工程师严老师&#xff0c;一起来学习如何使用三菱QD75系列定位模块来完成各种运动控制需求&#xff0c;本课程专门讲解这个三菱QD75定位模块&#xff0c;如果你不知道如何使用QD75模块或者说对QD75模块背后的理论和使用方法不是很熟悉的话&#xff0c;一定要来…

数据高效交互丨DolphinDB Redis 插件使用指南

DolphinDB 是一个高性能的分布式数据库。通过 Redis 插件&#xff0c;DolphinDB 用户可以轻松地与 Redis 数据库进行交互。用户不仅可以从 DolphinDB 向 Redis 发送数据&#xff0c;实现高速的数据写入操作&#xff1b;还可以从 Redis 读取数据&#xff0c;将实时数据流集成到 …

android13 设置左右分屏修改为单屏幕,应用分屏改为单屏

1.前言 android13中,系统设置变成,左边是一级菜单,右侧是二级菜单, 这样跟我们以前android7/8/9的布局是不一样的,我们需要将它修改为一级菜单,点进去才是二级菜单这种。 效果如下 2.系统设置实现分析 它这里使用的是google新出的embedding activity, 相关的知识这里…

【福利】代码公开!咸鱼之王自动答题脚本

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 微信或QQ打开咸鱼之王小程序&#xff0c;进入答题界面&#xff0c;运行main.py。期间不要动鼠标。 可自行更改代码来适配自己的需求~ 可以按照示例图片…

欧拉部署nginx

1.下载nginx 下载地址&#xff1a;https://nginx.org/en/download.html 选择稳定版本 下的镜像文件进行下载 2.解压Nginx包 cd /root/nginx tar -zxvf nginx-1.26.0.tar.gz cd nginx-1.26.03.安装nginx相关依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl o…

数据结构(初阶2.顺序表)

文章目录 一、线性表 二、顺序表 2.1 概念和结构 2.2 分类 2.2.1 静态顺序表 2.2.2 动态顺序表 2.3动态顺序表的实现 1.SeqList.h 2.SeqList.c 打印顺序表 初始化 销毁 增容 尾插 头插 在指定位置之前插入数据 尾删 头删 在指定位置删除数据 3.test.c 一、线性表 线性表&#…

浏览器中js外挂脚本的执行方式

1、开发工具控制台交互执行 网页中按F12打开开发者工具&#xff0c;选择“控制台”&#xff0c;键入js脚本命令回车执行&#xff0c;适用于临时使用脚本逻辑简单的场景&#xff0c;实例如下&#xff1a; // 获取网页元素的文本脚本 var elem document.getElementById("…

开发个人Go-ChatGPT–6 OpenUI

开发个人Go-ChatGPT–6 OpenUI Open-webui Open WebUI 是一种可扩展、功能丰富且用户友好的自托管 WebUI&#xff0c;旨在完全离线运行。它支持各种 LLM 运行器&#xff0c;包括 Ollama 和 OpenAI 兼容的 API。 功能 由于总所周知的原由&#xff0c;OpenAI 的接口需要密钥才…

Zabbix Sia Zabbix 逻辑漏洞(CVE-2022-23134)

前言 CVE-2022-23134是一个中等严重度的漏洞&#xff0c;影响Zabbix Web前端。这个漏洞允许未经身份验证的用户访问setup.php文件的某些步骤&#xff0c;这些步骤通常只对超级管理员开放。利用这个漏洞&#xff0c;攻击者可以通过跳过某些步骤来重新配置Zabbix前端&#xff0c…

Qt 线程同步机制 互斥锁 信号量 条件变量 读写锁

qt线程同步 Qt提供了丰富的线程同步机制来帮助开发者更高效和安全地进行多线程编程。其主要包括: QMutex:为共享数据提供互斥访问能力,避免同时写入导致的数据冲突。利用lock()/unlock()方法实现锁定和解锁。 QReadWriteLock:读写锁,允许多个读线程同时访问,但写操作需要独占…

Java面试八股之MySQL中int(10)和bigint(10)能存储读的数据大小一样吗

MySQL中int(10)和bigint(10)能存储读的数据大小一样吗 在MySQL中&#xff0c;int(10)和bigint(10)的数据存储能力并不相同&#xff0c;尽管括号内的数字&#xff08;如10&#xff09;看起来似乎暗示着某种关联&#xff0c;但实际上这个数字代表的是显示宽度&#xff0c;而不是…

基于信号量的生产者消费者模型

文章目录 信号量认识概念基于线程分析信号量信号量操作 循环队列下的生产者消费者模型理论认识代码部分 信号量 认识概念 信号量本质: 计数器 它也叫做公共资源 为了线程之间,进程间通信------>多个执行流看到的同一份资源---->多个资源都会并发访问这个资源(此时易出现…

Python OpenCV 教学取得视频资讯

这篇教学会介绍使用OpenCV&#xff0c;取得影像的长宽尺寸、以及读取影像中某些像素的颜色数值。 因为程式中的OpenCV 会需要使用镜头或GPU&#xff0c;所以请使用本机环境( 参考&#xff1a;使用Python 虚拟环境) 或使用Anaconda Jupyter 进行实作( 参考&#xff1a;使用Anaco…

关于.NETCORE站点程序部署到nginx上无法访问静态文件和无法正确生成文件的问题解决过程。

我的netcore6项目&#xff0c;部署到IIS的时候&#xff0c;生成报告时&#xff0c;需要获取公司LOGO图片放到PDF报告文件中&#xff0c;这时候访问静态图片没有问题。 然后还有生成邀请二维码图片&#xff0c;这时候动态创建图片路径和图片也没有问题&#xff0c;可以在站点的…