Leetcode刷题笔记--Hot31-40

1--颜色分类(75)

主要思路:

        快排

#include <iostream>
#include <vector>

class Solution {
public:
    void sortColors(std::vector<int>& nums) {
        quicksort(nums, 0, nums.size()-1);
    }

    void quicksort(std::vector<int>& nums, int left, int right){
        if(left >= right) return;
        int pivot = nums[left];
        int l = left, r = right;
        while(l < r){
            while(l < r && nums[r] >= pivot) r--;
            nums[l] = nums[r];
            while(l < r && nums[l] <= pivot) l++;
            nums[r] = nums[l];
        }
        nums[l] = pivot;
        quicksort(nums, left, l-1);
        quicksort(nums, l+1, right);
    }
};

int main(int argc, char *argv[]){
    // nums = [2,0,2,1,1,0]
    std::vector<int> test = {2, 0, 2, 1, 1, 0};
    Solution S1;
    S1.sortColors(test);
    for(auto item : test){
        std::cout << item << " ";
    }
    return 0;
}

主要思路: 

#include <iostream>
#include <vector>

class Solution {
public:
    void sortColors(std::vector<int>& nums) {
        int n = nums.size();
        int p0 = 0, p2 = n - 1;
        for (int i = 0; i <= p2; ++i) {
            while (i <= p2 && nums[i] == 2) {
                std::swap(nums[i], nums[p2]);
                --p2;
            }
            if (nums[i] == 0) {
                std::swap(nums[i], nums[p0]);
                ++p0;
            }
        }
    }
};

int main(int argc, char *argv[]){
    // nums = [2,0,2,1,1,0]
    std::vector<int> test = {2, 0, 2, 1, 1, 0};
    Solution S1;
    S1.sortColors(test);
    for(auto item : test){
        std::cout << item << " ";
    }
    return 0;
}

​​​​​​​​​​​​​​​​​​​​​2--最小覆盖子串(76)

主要思路:

        参考思路:视频讲解​​​​​​​

#include <iostream>
#include <string>
#include <unordered_map>

class Solution {
public:
    std::unordered_map<char, int> t_map;
    std::unordered_map<char, int> min_map;
public:
    std::string minWindow(std::string s, std::string t) {
        if(s.length() < t.length()) return "";
        for(int i = 0; i < t.length(); i++){
            if(t_map.find(t[i]) == t_map.end()) t_map[t[i]] = 1;
            else t_map[t[i]] += 1; 
        }
        int l = 0, r = 0;
        int min_l = 0, min_len = s.length() + 1;
        while(r < s.length()){
            if(min_map.find(s[r]) == min_map.end()) min_map[s[r]] = 1;
            else min_map[s[r]] += 1;
            while(check()){
                if(r - l + 1 < min_len){
                    min_l = l;
                    min_len = r - l + 1;
                }
                min_map[s[l]]--;
                l++; // 左指针右移
            }
            r++;
        }
        return min_len == s.length() + 1 ? "" : s.substr(min_l, min_len);
    }
    bool check(){
        if(t_map.size() > min_map.size()) return false;
        for(auto kv : t_map){
            char key = kv.first;
            int value = kv.second;
            if(min_map.find(key) == min_map.end() || min_map[key] < t_map[key]){
                return false;
            }
        }
        return true;
    }
};

int main(int argc, char *argv[]){
    // s = "ADOBECODEBANC", t = "ABC"
    std::string s = "ADOBECODEBANC";
    std::string t = "ABC";
    Solution S1;
    std::string res = S1.minWindow(s, t);
    std::cout << res << std::endl;
    return 0;
}

3--子集(78)

主要思路:

         整体思路有点类似全排列,对于数组中的元素,加入(递归)或不加入(回溯)到记录数组中;

        不同于全排列的是,本题 dfs 的时候不需要重头遍历所有元素,整个加入过程是前向的;

#include <iostream>
#include <vector>

class Solution {
public:
    std::vector<std::vector<int>> subsets(std::vector<int>& nums) {
        std::vector<int> tmp;
        res.push_back(tmp); // []
        dfs(nums, 0, tmp);
        return res;
    }

    void dfs(std::vector<int>& nums, int idx, std::vector<int>& tmp){
        if(idx == nums.size()) {
            return;
        }
        tmp.push_back(nums[idx]); // 加入当前的值
        res.push_back(tmp);
        dfs(nums, idx+1, tmp);
        tmp.pop_back(); // 回溯剔出当前加入的值
        dfs(nums, idx+1, tmp);
        return;   
    }
private:
    std::vector<std::vector<int>> res;
};

int main(int arc, char *argv[]){
    std::vector<int> test = {1, 2, 3};
    Solution S1;
    std::vector<std::vector<int>> res = S1.subsets(test);
    for(auto v : res){
        std::cout << "[";
        for(int item : v){
            std::cout << item << " ";
        }
        std::cout << "]" << std::endl;
    }
    return 0;
}

4--单词搜索(79)

主要思路:

        递归+回溯,遍历从board[i][j]出发,能否匹配给定的字符串;

        需要使用一个记录数组来标记当前 board[i][j] 是否被访问,回溯时还原访问状态;

#include <iostream>
#include <vector>
#include <string>

class Solution {
public:
    bool exist(std::vector<std::vector<char>>& board, std::string word) {
        int m = board.size(), n = board[0].size();
        std::vector<std::vector<bool>> vis(m, std::vector<bool>(n, false));
        bool res;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                res = dfs(i, j, 0, board, word, vis);
                if(res) return true;
            }
        }
        return false;
    }

    bool dfs(int i, int j, int cur, std::vector<std::vector<char>>& board, std::string word, std::vector<std::vector<bool>>& vis){
        if(cur == word.length()) return true;
        if(i >= board.size() || j >= board[0].size() || i < 0 || j < 0 || board[i][j] != word[cur] || vis[i][j] == true){
            return false;
        }
        vis[i][j] = true;
        bool res = dfs(i+1, j, cur+1, board, word, vis) || dfs(i, j+1, cur+1, board, word, vis)
                || dfs(i-1, j, cur+1, board, word, vis) || dfs(i, j-1, cur+1, board, word, vis);
        vis[i][j] = false; // 回溯
        return res;
    }
};

int main(int arc, char *argv[]){
    // board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]]
    // word = "ABCCED"
    std::vector<std::vector<char>> board = {{'A', 'B', 'C', 'E'}, 
                                            {'S', 'F', 'C', 'S'}, 
                                            {'A', 'D', 'E', 'E'}};
    std::string word = "ABCCED";
    Solution S1;
    bool res = S1.exist(board, word);
    if(res) std::cout << "true" << std::endl;
    else std::cout << "false" << std::endl;
    return 0;
}

5--柱状图中最大的矩形(84)

主要思路:

                

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

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

相关文章

软件工程(九) UML顺序-活动-状态-通信图

顺序图和后面的一些图,要求没有用例图和类图那么高,但仍然是比较重要的,我们也需要按程度去了解。 1、顺序图 顺序图(sequence diagram, 顺序图),顺序图是一种交互图(interaction diagram),它强调的是对象之间消息发送的顺序,同时显示对象之间的交互。 下面以一个简…

WebSocket- 前端篇

官网代码 // 为了浏览器兼容websocketconst WebSocket window.WebSocket || window.MozWebSocket// 创建连接 this.socket new WebSocket(ws://xxx)// 连接成功this.socket.onopen (res)>{console.log(websocket 连接成功)this.socket.send(入参字段) // 传递的参数字段}…

软件工程(二十) 系统运行与软件维护

1、系统转换计划 1.1、遗留系统的演化策略 时至今日,你想去开发一个系统,想完全不涉及到已有的系统,基本是不可能的事情。但是对于已有系统我们有一个策略。 比如我们是淘汰掉已有系统,还是继承已有系统,或者集成已有系统,或者改造遗留的系统呢,都是不同的策略。 技术…

使用vlc在线播放rtsp视频url

1. 2. 3. 工具链接&#xff1a; https://download.csdn.net/download/qq_43560721/88249440

云计算——虚拟化中的网络架构与虚拟网络(文末送书)

作者简介&#xff1a;一名云计算网络运维人员、每天分享网络与运维的技术与干货。 公众号&#xff1a;网络豆 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a; 网络豆的主页​​​​​ 目录 前期回顾 前言 一.网卡虚拟化 1.网卡虚拟化方法&…

拆解即时通讯行销,如何提升讯息开启率达300%?

图片来源&#xff1a;SaleSmartly官网 科技日新月异&#xff0c;今时今日商家均转战网络世界&#xff0c;开设网店售卖产品或服务&#xff0c;不少人都会转用即时通讯&#xff08;Instant Messaging&#xff0c;简称IM&#xff09;软件来和客户联络和宣传&#xff0c;因为即时通…

iTween安装

1. 找到Package Manager面板&#xff0c;Packages选择MyAssets-右上角搜索iTween-找到后点DownLoad-点Import 导入 2. 导入后Assets面板结构如下图。 3. 编译器中输入iTween有提示&#xff0c;安装成功。

DevOps系列文章之 Python基础

列表 Python中的列表类似于C语言中的数组的概念&#xff0c;列表由内部的元素组成&#xff0c;元素可以是任何对象 Python中的列表是可变的 简单的理解就是&#xff1a;被初始化的列表&#xff0c;可以通过列表的API接口对列表的元素进行增删改查 1、定义列表 1.可以将列表当成…

图论算法基础:单源最短路径Dijkstra算法分析

文章目录 图的邻接矩阵 一.Dijkstra算法分析算法的核心逻辑要素算法的执行逻辑 二.Dijkstra算法接口实现邻接矩阵堆优化版本: 图的邻接矩阵 namespace Graph_Structure {//Vertex是代表顶点的数据类型,Weight是边的权值的数据类型,MAX_W是权值的上限值(表示不相两)//Direction…

bpmnjs Properties-panel拓展(属性设置篇)

最近有思考工作流相关的事情&#xff0c;绘制bpmn图的工具认可度比较高的就是bpmn.js了&#xff0c;是一个基于node.js的流程图绘制框架。初始的框架只实现了基本的可视化&#xff0c;想在xml进行客制化操作的话需要拓展&#xff0c;简单记录下几个需求的实现过程。 修改基础 …

ZLMediaKit 重建docker包

1.下载容器到本地服务器并运行 #此镜像为github持续集成自动编译推送&#xff0c;跟代码(master分支)保持最新状态 docker run -id -p 1935:1935 -p 8080:80 -p 8443:443 -p 8554:554 -p 10000:10000 -p 10000:10000/udp -p 8000:8000/udp -p 9000:9000/udp zlmediakit/zlmedi…

第六章:数据结构与算法-par1:典型数据结构

文章目录 一、典型数据结构介绍1.1 基本概念和术语1、基本数据概念2、抽象数据类型3、算法4、算法复杂度5、数据结构 二、数据的存储结构2.1 线性结构1、线性表&#xff08;一般线性表&#xff09;2、栈和队列&#xff08;受限线性表&#xff09;1) 栈 Stack2&#xff09; 队列…

Linux下套接字TCP实现网络通信

Linux下套接字TCP实现网络通信 文章目录 Linux下套接字TCP实现网络通信1.引言2.具体实现2.1接口介绍1.socket()2.bind()3.listen()4.accept()5.connect() 2.2 服务器端server.hpp2.3服务端server.cc2.4客户端client.cc 1.引言 ​ 套接字(Socket)是计算机网络中实现网络通信的一…

ATA-2161高压放大器的电子实验案例(案例合集)

ATA-2161是一款理想的可放大交直流信号的单通道高压放大器。最大差分输出1600Vp-p(800Vp)高压&#xff0c;可以驱动高压型负载。凭借其优异的指标参数受到不少电子工程师的喜欢&#xff0c;其在电子实验中的应用也非常频繁&#xff0c;下面为大家整理出ATA-2161高压放大器的应用…

Android全面屏下,默认不会全屏显示,屏幕底部会留黑问题

前些天发现了一个蛮有意思的人工智能学习网站,8个字形容一下"通俗易懂&#xff0c;风趣幽默"&#xff0c;感觉非常有意思,忍不住分享一下给大家。 &#x1f449;点击跳转到教程 公司以前的老项目&#xff0c;便出现了这种情况&#xff0c;网上搜索了各种资料&#xf…

LVS集群 (四十四)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、集群概述 1. 负载均衡技术类型 2. 负载均衡实现方式 二、LVS结构 三、LVS工作模式 四、LVS负载均衡算法 1. 静态负载均衡 2. 动态负载均衡 五、ipvsadm命令详…

docker高级(redis集群三主三从)

1. 新建6个docker容器redis实例 docker run -d --name redis-node-1 --net host --privilegedtrue -v /redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381docker run -d --name redis-node-2 --net host --privilegedtrue -v /…

Matlab图像处理-平移运算

几何运算 几何运算又称为几何变换&#xff0c;是将一幅图像中的坐标映射到另外一幅图像中的新坐标位置&#xff0c;它不改变图像的像素值&#xff0c;只是改变像素所在的几何位置&#xff0c;使原始图像按照需要产生位置、形状和大小的变化。 图像几何运算的一般定义为&#…

STM32使用PID调速

STM32使用PID调速 PID原理 PID算法是一种闭环控制系统中常用的算法&#xff0c;它结合了比例&#xff08;P&#xff09;、积分&#xff08;I&#xff09;和微分&#xff08;D&#xff09;三个环节&#xff0c;以实现对系统的控制。它的目的是使 控制系统的输出值尽可能接近预…

JVM——内存模型

1.java内存模型 1.1 原子性 1.2 问题分析 这里与局部变量自增不同&#xff0c;局部变量调用iinc是在局部变量表槽位上进行自增。 静态变量是在操作数栈自增。 这里的主内存和工作内存时再JMM里的说法。 因为操作系统是时间片切换的多个线程轮流使用CPU. 1.3解决方法 JMM中…