LeetCode 刷题记录——从零开始记录自己一些不会的(二)

news2024/11/17 14:49:55

20. 替换后的最长重复字符

  • 题意

给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符,并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。

在执行上述操作后,返回包含相同字母的最长子字符串的长度。

  • 思路

image-20230912101653098

  • 代码
class Solution {
public:
    int characterReplacement(string s, int k) {
        vector<int> num(26);
        int n = s.length();
        int maxn = 0;
        int left = 0,right = 0;
        while (right < n) {
            num[s[right]-'A'] ++;
            maxn = max(maxn,num[s[right]-'A']);
            if (right - left + 1 - maxn > k) {
                num[s[left]-'A'] --;
                left ++;
            }
            right ++;
        }
        return right - left;
    }
};

21. 最大宽度坡

  • 题意

给定一个整数数组 A是元组 (i, j),其中 i < jA[i] <= A[j]。这样的坡的宽度为 j - i

找出 A 中的坡的最大宽度,如果不存在,返回 0 。

  • 思路

image-20230912111215808

  • 代码
class Solution {
public:
    int maxWidthRamp(vector<int>& nums) {
        stack<int> s;
        int res = 0;
        int n = nums.size();
        s.push(0);
        for (int i = 0;i < n;i ++) {
            if (s.empty()||nums[s.top()] > nums[i]) 
                s.push(i);
        }
        for (int j = n-1;j >= res;--j) {
            while (s.size()&&nums[s.top()] <= nums[j]) {
                int pos = s.top();
                s.pop();
                res = max(res,j - pos);
            }
        }
        return res;
    }
};

22. 销售利润最大化

  • 题意

image-20230922211922241

  • 思路

区间合并+动态规划

image-20230922212042158

  • 代码
class Solution {
public:
    int maximizeTheProfit(int n, vector<vector<int>> &offers) {
        vector<vector<pair<int, int>>> groups(n);
        for (auto &offer: offers)
            groups[offer[1]].emplace_back(offer[0], offer[2]);

        vector<int> f(n + 1);
        for (int end = 0; end < n; end++) {
            f[end + 1] = f[end];
            for (auto &[start, gold]: groups[end])
                f[end + 1] = max(f[end + 1], f[start] + gold);
        }
        return f[n];
    }
};

23. 判断是否能拆分数组

  • 题意

image-20230922221542787

  • 思路

image-20230922221952460

  • 代码
class Solution {
    public boolean canSplitArray(List<Integer> nums, int m) {
        //区间DP
        int n=nums.size();
        //f[i][j]:nums[i...j]能否拆分成合法数组
        boolean[][] f=new boolean[n][n];
        int[] pre=new int[n];
        pre[0]=nums.get(0);
        //构建前缀和数组
        for(int i=1;i<n;i++){
            pre[i]=pre[i-1]+nums.get(i);
        }
        for(int i=n-1;i>=0;i--){
            f[i][i]=true;
            if(i+1<n)   f[i][i+1]=true;
            for(int j=i+2;j<n;j++){
                //pre[j]-pre[i]表示sum(nums[i+1...j])
                //若sum(nums[i+1...j])>=m,那么nums[i...j]能否合法拆分取决于nums[i+1...j]能否合法拆分
                if(pre[j]-pre[i]>=m&&f[i+1][j]){
                    f[i][j]=true;
                }
                //pre[j]-pre[i]+nums.get(i)-nums.get(j)表示sum(nums[i...j-1])
                //这种写法可以防止数组越界
                //若sum(nums[i...j-1])>=m,那么nums[i...j]能否合法拆分取决于nums[i...j-1]能否合法拆分
                else if(pre[j]-pre[i]+nums.get(i)-nums.get(j)>=m&&f[i][j-1]){
                    f[i][j]=true;
                }else{
                    f[i][j]=false;
                }               
            }
        }
        return f[0][n-1];
    }
};
  • 思路2

image-20230922222045296

  • 代码
class Solution {
public:
    bool canSplitArray(vector<int> &nums, int m) {
        int n = nums.size();
        if (n <= 2) return true;
        for (int i = 1; i < n; i++)
            if (nums[i - 1] + nums[i] >= m)
                return true;
        return false;
    }
};

24. 找出最安全路径

  • 思路

image-20230922222140352

  • 思路

二分+BFS

  • 代码
// 二分 + BFS
int maximumSafenessFactor(vector<vector<int>> &grid) {
    typedef pair<int, int> P;
    const int N = 401;
    int n = grid.size();
    int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
    
    // 1.求每个点的安全系数,同上
    
    // 2.求最大安全系数
    // 2.1 check函数,检查是否存在结点安全系数均大于等于k的路径
    function<bool(int)> check = [&](int k) {
        bool f[n][n];
        memset(f, 0, sizeof f);
        queue<P> q;
        q.emplace(0, 0), f[0][0] = true;
        while (!q.empty()) {
            int x = q.front().first, y = q.front().second;
            q.pop();
            for (int i = 0; i < 4; i++) {
                int u = x + dx[i], v = y + dy[i];
                if (u < 0 || u >= n || v < 0 || v >= n ||
                    f[u][v] || d[u][v] < k)
                    continue;
                q.emplace(u, v), f[u][v] = true;
            }
        }
        return f[n - 1][n - 1];
    };
    // 2.2 二分
    int l = 0, r = min(d[0][0], d[n - 1][n - 1]), mid;
    while (l < r) {
        mid = (l + r + 1) >> 1;
        if (check(mid))l = mid;
        else r = mid - 1;
    }
    return l;
};
  • 思路2

image-20230922222510370

  • 代码
class Solution {
    static constexpr int dirs[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public:
    int maximumSafenessFactor(vector<vector<int>> &grid) {
        int n = grid.size();
        vector<pair<int, int>> q;
        vector<vector<int>> dis(n, vector<int>(n, -1));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (grid[i][j]) {
                    q.emplace_back(i, j);
                    dis[i][j] = 0;
                }
            }
        }

        vector<vector<pair<int, int>>> groups = {q};
        while (!q.empty()) { // 多源 BFS
            vector<pair<int, int>> nq;
            for (auto &[i, j]: q) {
                for (auto &d: dirs) {
                    int x = i + d[0], y = j + d[1];
                    if (0 <= x && x < n && 0 <= y && y < n && dis[x][y] < 0) {
                        nq.emplace_back(x, y);
                        dis[x][y] = groups.size();
                    }
                }
            }
            groups.push_back(nq); // 相同 dis 分组记录
            q = move(nq);
        }

        // 并查集模板
        vector<int> fa(n * n);
        iota(fa.begin(), fa.end(), 0);
        function<int(int)> find = [&](int x) -> int { return fa[x] == x ? x : fa[x] = find(fa[x]); };

        for (int ans = (int) groups.size() - 2; ans > 0; ans--) {
            for (auto &[i, j]: groups[ans]) {
                for (auto &d: dirs) {
                    int x = i + d[0], y = j + d[1];
                    if (0 <= x && x < n && 0 <= y && y < n && dis[x][y] >= dis[i][j])
                        fa[find(x * n + y)] = find(i * n + j);
                }
            }
            if (find(0) == find(n * n - 1)) // 写这里判断更快些
                return ans;
        }
        return 0;
    }
};

无意中发现的大佬博客

多源BFS

LeetCode 75 精选面试必备的75道核心题目

1. 递增的三元子序列
  • 题意

image-20230915122335059

  • 思路

树状数组+哈希

image-20230915122537986

  • 代码
class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int n = nums.size();
        if (n < 3) {
            return false;
        }
        int first = nums[0], second = INT_MAX;
        for (int i = 1; i < n; i++) {
            int num = nums[i];
            if (num > second) {
                return true;
            } else if (num > first) {
                second = num;
            } else {
                first = num;
            }
        }
        return false;
    }
};
2. 盛最多水的容器
  • 题意

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:**你不能倾斜容器。

img

  • 思路

image-20230916203200681

  • 代码
class Solution {
public:
    int maxArea(vector<int>& height) {
        int i = 0, j = height.size() - 1, res = 0;
        while(i < j) {
            res = height[i] < height[j] ? 
                max(res, (j - i) * height[i++]): 
                max(res, (j - i) * height[j--]); 
        }
        return res;
    }
};
  • 扩展 接雨水

    • 题意

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

    img

    • 思路

    image-20230916204849361

    fig1

    • 代码
    class Solution {
    public:
        int trap(vector<int>& height) {
            int n = height.size();
            if (n == 0) {
                return 0;
            }
            vector<int> leftMax(n);
            leftMax[0] = height[0];
            for (int i = 1; i < n; ++i) {
                leftMax[i] = max(leftMax[i - 1], height[i]);
            }
    
            vector<int> rightMax(n);
            rightMax[n - 1] = height[n - 1];
            for (int i = n - 2; i >= 0; --i) {
                rightMax[i] = max(rightMax[i + 1], height[i]);
            }
    
            int ans = 0;
            for (int i = 0; i < n; ++i) {
                ans += min(leftMax[i], rightMax[i]) - height[i];
            }
            return ans;
        }
    };
    
    • 单调栈做法

    img

    image-20230916210426274

    • 代码
    class Solution {
    public:
        int trap(vector<int>& height) {
            int ans = 0;
            stack<int> stk;
            int n = height.size();
            for (int i = 0; i < n; ++i) {
                while (!stk.empty() && height[i] > height[stk.top()]) {
                    int top = stk.top();
                    stk.pop();
                    if (stk.empty()) {
                        break;
                    }
                    int left = stk.top();
                    int currWidth = i - left - 1;
                    int currHeight = min(height[left], height[i]) - height[top];
                    ans += currWidth * currHeight;
                }
                stk.push(i);
            }
            return ans;
        }
    };
    

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

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

相关文章

学习MLPERF

测试基准与标准 | BenchCouncil 其中涉及AI的有如下&#xff1a; AI (1) AIBench Training AIBench 培训采用平衡的 AI 基准测试方法&#xff0c;考虑全面性、代表性、可负担性和可移植性。该方法广泛调查人工智能任务和模型&#xff0c;并在最大程度上涵盖了算法级、系统级…

玩转YAML配置文件占位符 ,同事纷纷直呼大佬

配置文件占位符 Spring Boot配置文件支持占位符&#xff0c;一些用法如下&#xff1a; 为server.port设置一个随机端口 server: port: ${random.int} 其他随机占位符 // 随机数占位符${random.value} - 类似uuid的随机数&#xff0c;没有"-"连接${random.int} - 随…

【李沐深度学习笔记】矩阵计算(5)

课程地址和说明 线性代数实现p4 本系列文章是我学习李沐老师深度学习系列课程的学习笔记&#xff0c;可能会对李沐老师上课没讲到的进行补充。 本节是第五篇&#xff0c;由于CSDN限制&#xff0c;只能被迫拆分 矩阵计算 多元函数的等高线 此处参考视频&#xff1a;熟肉)多元…

c语言-实用调试技巧

什么是bug&#xff1f; 程序中出现的问题 调试是什么&#xff1f;有多重要&#xff1f; 测试的基本步骤&#xff1a;发现程序错误的存在 以隔离、消除等方式对错误进行定位&#xff0c;确定错误产生的原因&#xff0c;提出纠正错误的解决办法&#xff0c;对程序错误予以改正…

【Servlet】第一个 Servlet 项目

第一个 Servlet 项目 一. Servlet 是什么二. Servlet 主要做的工作三. 第一个 Servlet 程序1. 创建项目2. 引入依赖3. 创建目录4. 编写代码5. 打包程序6. 部署程序7. 验证程序 四. 更方便的部署方式1. 安装 Smart Tomcat 插件2. 配置 Smart Tomcat 插件 一. Servlet 是什么 Se…

2023华为杯数学建模研赛思路分享——最全版本E题技术文档深度解析已出

2023华为杯数学建模研赛E题最新完整版技术文档已出 更多内容加群了解咨询【云顶数模科研交流群】&#xff1a; 正在跳转​qm.qq.com/cgi-bin/qm/qr?_wv1027&kzZ9YYiFSIhMwasovgcr-Fq6wp_ZF2-To&authKeyIDnk4VjKwk4FWcwTKW1ye8qfCOZjKbx%2FeLQVSFeD%2BrrUNJnhWAYwC%2…

OceanBase再获OSCAR两项大奖,坚定开源开放

2023 年 9 月 21 日&#xff0c;由中国信息通信研究院&#xff08;简称“中国信通院”&#xff09;、中国通信标准化协会联合主办的“OSCAR 开源产业大会”在京召开。本次发布了 2023 年可信开源评估结果&#xff0c;OceanBase 通过 可信开源 社区评估&#xff0c;荣获 “OSCAR…

【打开新世界大门】看测试老鸟如何把API 测试玩弄在鼓掌之间

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 一、API 测试的基本步骤 我介绍过当今互联网产品的测试策略往往会采用菱形结构&#xff0c;即重量级 AP…

蜣螂优化(DBO)算法的5种最新变体(含MATLAB代码)

先做一个声明&#xff1a;文章是由我的个人公众号中的推送直接复制粘贴而来&#xff0c;因此对智能优化算法感兴趣的朋友&#xff0c;可关注我的个人公众号&#xff1a;启发式算法讨论。我会不定期在公众号里分享不同的智能优化算法&#xff0c;经典的&#xff0c;或者是近几年…

spark Structured报错解决

报错&#xff0c;不想看原因的直接去解决方案试试 Exception in thread "main" java.lang.IllegalArgumentException: Pathname /C:/Users/Administrator/AppData/Local/Temp/1/temporary-611514af-8dc5-4b20-9237-e5f2d21fdf88/metadata from hdfs://master:8020/C…

C/C++连接数据库,包含完整代码。

C/C连接数据库 本篇文章意在简洁明了的在linux环境下使用C/C连接远程数据库&#xff0c;并对数据库进行增删查改等操作。我所使用的环境是centos7&#xff0c;不要环境除环境配置外&#xff0c;代码是大同小异的。完整代码在最底部&#xff01;&#xff01;&#xff01; 1.前…

[极客大挑战 2019]RCE ME 取反绕过正则匹配 绕过disable_function设置

目录 取反 1.蚁剑插件绕过 2.baypass disable_function open_dir/disable_function putenv()/LD_PRELOAD 来绕过限制 利用条件 利用思路 有意思。。。。 <?php error_reporting(0); if(isset($_GET[code])){$code$_GET[code];if(strlen($code)>40){die("Th…

redis的安装、基础命令及常用数据结构

文章目录 前言一、Redis安装1.Ubuntu下安装&#xff08;1&#xff09;切换到root用户下&#xff08;2&#xff09;使用apt安装redis5&#xff08;3&#xff09;为了使redis支持远程连接&#xff0c;修改以下地方&#xff08;4&#xff09;验证安装是否成功 2.Centos7下安装&…

【C++】STL简介 | string类的常用接口

目录 STL简介 学string类前的铺垫 概念 为什么要学string类 string类的底层&#xff08;了解&#xff09; 编码表的故事 string类的常用接口与应用 3个必掌握的构造 赋值 访问字符operator[] 初识迭代器&#xff08;iterator&#xff09; 反向迭代器 用范围for遍历…

uniapp获取一周日期和星期

UniApp可以使用JavaScript中的Date对象来获取当前日期和星期几。以下是一个示例代码&#xff0c;可以获取当前日期和星期几&#xff0c;并输出在一周内的每天早上和晚上&#xff1a; // 获取当前日期和星期 let date new Date(); let weekdays ["Sunday", "M…

剔除数据中的异常值(python实现)

目录 一、3σ原则 二、箱线图发现异常值 三、boxcox数据变换 一、3σ原则 该准则仅局限于对正态或近似正态分布的样本数据处理,此外,当测量次数少的情形用准则剔除粗大误差是不够可靠的。 异常值是指样本中的个别值,其数值明显偏离其余的观测值。异常值也称离群点,异常…

xpath定位不包含某种属性的元素

今天定位一个页面中的input文本框&#xff0c;发现竟然有两个几乎一模一样的html代码的input文本框。 唯一不同的是&#xff0c;一图中的input有一个comps"[object Object],[object Object]"的属性和属性值&#xff0c;二图则没有。我要定位的是二图中的input&#x…

AUTOSAR实战篇:手把手带你搞定Watchdog协议栈

AUTOSAR实战篇:手把手带你搞定Watchdog协议栈 前言 小T出品,必是精品! 手把手搞定Watchdog协议栈,你值得拥有! 正文 在进行Watchdog协议栈实战之前,建议先阅读小T之前有关Watchdog协议栈的两篇文章《Watchdog协议栈上》与《Watchdog协议栈下》先了解下在AUTOSAR框架下的W…

【Redis】第7讲 常用的操作命令

连接redis并测试 redis-cliping 设置并获取数据 set k1 chinaget k1 测试性能 rootsue-virtual-machine:~# redis-benchmark ctrlc 退出redis,执行命令5秒就ctrlc关闭&#xff0c;性能要看电脑的配置高低 默认16个数据库 vim /opt/redis-5.0.4/redis.conf 数据库键的数量 …

深入理解web安全攻防策略,看完这一篇就够了

前言 互联网时代&#xff0c;数据安全与个人隐私信息等受到极大的威胁和挑战&#xff0c;本文将以几种常见的攻击以及防御方法展开分析。 1. XSS (跨站脚本攻击) 定义&#xff1a;通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击…