LeetCode高频算法刷题记录7

news2024/10/6 10:39:07

文章目录

  • 1. 下一个排列【中等】
    • 1.1 题目描述
    • 1.2 解题思路
    • 1.3 代码实现
  • 2. 两数相加【中等】
    • 2.1 题目描述
    • 2.2 解题思路
    • 2.3 代码实现
  • 3. 括号生成【中等】
    • 3.1 题目描述
    • 3.2 解题思路
    • 3.3 代码实现
  • 4. 滑动窗口最大值【困难】
    • 4.1 题目描述
    • 4.2 解题思路
    • 4.3 代码实现
  • 5. 最小覆盖子串【困难】
    • 5.1 题目描述
    • 5.2 解题思路
    • 5.3 代码实现

1. 下一个排列【中等】

题目链接:https://leetcode.cn/problems/next-permutation/
参考题解:https://leetcode.cn/problems/next-permutation/solution/xia-yi-ge-pai-lie-suan-fa-xiang-jie-si-lu-tui-dao-/

1.1 题目描述

整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
  • 而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

必须 原地 修改,只允许使用额外常数空间。

示例1:

输入:nums = [1,2,3]
输出:[1,3,2]

示例2:

输入:nums = [3,2,1]
输出:[1,2,3]

示例3:

输入:nums = [1,1,5]
输出:[1,5,1]

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100

1.2 解题思路

1.3 代码实现

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int len = nums.size();
        int leftMax = len - 2;
        int rightMax = len - 1;
        while(leftMax >= 0 && nums[leftMax] >= nums[leftMax + 1])
            --leftMax;
        if(leftMax >= 0) {
            while(rightMax >= 0 && nums[leftMax] >= nums[rightMax])
                --rightMax;
            swap(nums[leftMax], nums[rightMax]);    
        }
        reverse(nums.begin() + leftMax + 1, nums.end());
    }
};

2. 两数相加【中等】

题目链接:https://leetcode.cn/problems/add-two-numbers/
参考题解:https://leetcode.cn/problems/add-two-numbers/solution/liang-shu-xiang-jia-by-leetcode-solution/

2.1 题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例1:
在这里插入图片描述

输入:l1 = [2,4,3], l2 = [5,6,4]
输出:[7,0,8]
解释:342 + 465 = 807.

示例2:

输入:l1 = [0], l2 = [0]
输出:[0]

示例3:

输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9]
输出:[8,9,9,9,0,0,0,1]

提示:

  • 每个链表中的节点数在范围 [1, 100] 内
  • 0 <= Node.val <= 9
  • 题目数据保证列表表示的数字不含前导零

2.2 解题思路

2.3 代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* dummy = new ListNode();
        ListNode* current = dummy;
        int carry = 0;
        while(l1 || l2 || carry) {
            int val1 = l1 ? l1->val : 0;
            int val2 = l2 ? l2->val : 0;
            int sum = val1 + val2 + carry;
            current->next = new ListNode(sum % 10);
            current = current->next;
            carry = sum / 10;
            if(l1) l1 = l1->next;
            if(l2) l2 = l2->next;
        }
        return dummy->next;
    }
};

3. 括号生成【中等】

题目链接:https://leetcode.cn/problems/generate-parentheses/
参考题解:https://leetcode.cn/problems/generate-parentheses/solution/gua-hao-sheng-cheng-by-leetcode-solution/

3.1 题目描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例1:

输入:n = 3
输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]

示例2:

输入:n = 1
输出:[“()”]

提示:

  • 1 <= n <= 8

3.2 解题思路

3.3 代码实现

class Solution {
public:
    void tryGenerate(vector<string>& ans, string str, int n, int leftNum, int rightNum) {
        int len = str.length();
        if(len == n * 2) {
            ans.push_back(str);
            return;
        }
        if(leftNum < n) {
            str.push_back('(');
            tryGenerate(ans, str, n, leftNum + 1, rightNum);
            str.pop_back();
        }
        if(rightNum < leftNum) {
            str.push_back(')');
            tryGenerate(ans, str, n, leftNum, rightNum + 1);
            str.pop_back();
        }
    }
    vector<string> generateParenthesis(int n) {
        vector<string> ans;
        tryGenerate(ans, "", n, 0, 0);
        return ans;
    }
};

4. 滑动窗口最大值【困难】

题目链接:https://leetcode.cn/problems/sliding-window-maximum/
参考题解:https://leetcode.cn/problems/sliding-window-maximum/solution/hua-dong-chuang-kou-zui-da-zhi-by-leetco-ki6m/

4.1 题目描述

给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回 滑动窗口中的最大值

示例1:

输入:nums = [1,3,-1,-3,5,3,6,7], k = 3
输出:[3,3,5,5,6,7]
解释:
滑动窗口的位置 最大值
[1 3 -1] -3 5 3 6 7 3
1 [3 -1 -3] 5 3 6 7 3
1 3 [-1 -3 5] 3 6 7 5
1 3 -1 [-3 5 3] 6 7 5
1 3 -1 -3 [5 3 6] 7 6
1 3 -1 -3 5 [3 6 7] 7

示例2:

输入:nums = [1], k = 1
输出:[1]

提示:

  • 1 <= nums.length <= 10^5
  • -10^4 <= nums[i] <= 10^4
  • 1 <= k <= nums.length

4.2 解题思路

4.3 代码实现

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int len = nums.size();
        priority_queue<pair<int, int>> currentWindow;
        vector<int> ans;
        for(int i = 0; i < k; ++i) {
            currentWindow.emplace(nums[i], i);
        }
        ans.push_back(currentWindow.top().first);
        for(int i = k; i < len; ++i) {
            currentWindow.emplace(nums[i], i);
            while(currentWindow.top().second < i - k + 1)
                currentWindow.pop();
            ans.push_back(currentWindow.top().first);
        }
        return ans;
    }
};

5. 最小覆盖子串【困难】

题目链接:https://leetcode.cn/problems/minimum-window-substring/
参考题解:https://leetcode.cn/problems/minimum-window-substring/solution/tong-su-qie-xiang-xi-de-miao-shu-hua-dong-chuang-k/

5.1 题目描述

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。

注意:

  • 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
  • 如果 s 中存在这样的子串,我们保证它是唯一的答案。

示例1:

输入:s = “ADOBECODEBANC”, t = “ABC”
输出:“BANC”
解释:最小覆盖子串 “BANC” 包含来自字符串 t 的 ‘A’、‘B’ 和 ‘C’。

示例2:

输入:s = “a”, t = “a”
输出:“a”
解释:整个字符串 s 是最小覆盖子串。

示例3:

输入: s = “a”, t = “aa”
输出: “”
解释: t 中两个字符 ‘a’ 均应包含在 s 的子串中,
因此没有符合条件的子字符串,返回空字符串。

提示:

  • m == s.length
  • n == t.length
  • 1 <= m, n <= 10^5
  • s 和 t 由英文字母组成

进阶: 你能设计一个在 o(m+n) 时间内解决此问题的算法吗?

5.2 解题思路

5.3 代码实现

class Solution {
public:
    string minWindow(string s, string t) {
        int min = s.length() + 1;
        unordered_map<char, int> need;
        int needNum = t.length();
        for(char c : t) {
            need[c]++;
        }
        int left = 0, right = 0;
        int start = 0;
        while(right < s.length()) {
            if(need[s[right]] > 0)
                needNum--;
            need[s[right]]--;
            if(!needNum) {
                while(left < right && need[s[left]] < 0) {
                    need[s[left]]++;
                    left++;
                }
                if(right - left + 1 < min) {
                    min = right - left + 1;
                    start = left;
                }
                need[s[left]]++;
                left++;
                needNum++;
            }
            right++;
        }
        return min <= s.length() ? s.substr(start, min) : "";
    }
};

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

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

相关文章

c++boost库学习-07-Message Queue

一、前言 boost中的消息队列&#xff08;Message Queue&#xff09;是进程间通信的一种机制&#xff0c;实际上是其内部也是采用共享内存的方式来达到进程间通信的目的。这也就意味这Message Queue有其局限性&#xff1a;只有处在同一台计算机中的不同进程才能使用消息队列进行…

在原有机械硬盘的基础上集装固态硬盘并装操作系统

1、加装固态硬盘 我的电脑出场自带的是机械硬盘&#xff08;即右边那个白色长方形&#xff0c;上面有类似于锡纸一样的东西&#xff09;&#xff0c;左边的这个光滑的正方形里面是内存条&#xff0c;可以拆开这个光滑的盖进行安装&#xff0c;而我们的固态硬盘装在左下角这个长…

性能测试——性能统计工具

性能统计工具 一、io监控命令1、io监控命令iostat2、io指标监控命令df 二、cpu监控命令1、cpu指标监控命令uptime2、cpu指标监控命令 cat /proc/cpuinfo3、cpu 指标监控命令 mpstat4、cpu指标监控命令 sar 三、mem指标监控命令1、mem指标监控命令 cat /proc/meminfo2、mem指标监…

KVM虚拟化(二)

文章目录 4.7 kvm虚拟机克隆4.7.1 完整克隆4.7.2 链接克隆 4.8 kvm虚拟机的桥接网络4.8.1 创建桥接网卡4.8.2 新虚拟机使用桥接模式4.8.3 将已有虚拟机网络修改为桥接模式 4.9 热添加技术4.9.1 kvm热添加硬盘4.9.2 kvm虚拟机在线热添加网卡4.9.3 kvm虚拟机在线热添加内存4.9.4 …

自动化测试技术解析:Appium、Sikuli与MonkeyTalk

目录 前言&#xff1a; 一、Appium自动化测试框架 它的优点是&#xff1a; 二、Sikuli自动化测试工具 它的优点是&#xff1a; 三、MonkeyTalk自动化测试工具 它的优点是&#xff1a; 四、代码样例 总结&#xff1a; 前言&#xff1a; 随着移动应用的普及&#xff0c;…

手把手教你通过PaddleHub快速实现输入中/英文本生成图像(Stable Diffusion)

近来&#xff0c;基于Diffusion的文图生成模型比较火&#xff0c;用户输入一句话&#xff0c;模型就可以生成一副对应的图像&#xff0c;还是很有意思的。本文记录了通过PaddleHub快速实现上述任务的过程&#xff0c;以供参考。 1、安装PaddlePaddle PaddleHub底层依赖于百度…

ChatGPT工作提效之生成开发需求和报价单并转为Excel格式

ChatGPT工作提效之生成开发需求和报价单并转为Excel格式 一、提出需求如何撰写百度地图标注开发的需求文档 二、针对性地连续提问推荐下一下百度地图标注文档的详细需求列表如何撰写百度地图标注开发的技术规范如何确定百度地图标注开发后的部署计划... 三、生成报价单四、运营…

【2023 · CANN训练营第一季】进阶班 应用开发深入讲解→模型推理

1 模型离线推理 各步要解析如下: Host&Device内存管理与数据传输: Host&Device上的内存申请与释放&#xff0c;内存间的相互拷贝;模型加载:将离线的om文件加载到Device上;在样例的资源初始化模块中进行。模型输入输出准备∶根据禹线om的输入输出&#xff0c;在Device…

微信小程序富文本组件mp-html

功能介绍 支持在多个主流的小程序平台和 uni-app 中使用支持丰富的标签&#xff08;包括 table、video、svg 等&#xff09;支持丰富的事件效果&#xff08;自动预览图片、链接处理等&#xff09;支持设置占位图&#xff08;加载中、出错时、预览时&#xff09;支持锚点跳转、…

【Linux】在Linux操作系统下对于权限的理解

目录 ❤️前言 正文 Linux下的不同用户 Linux的权限管理 文件访问者的分类 文件类型和访问权限 文件访问权限的修改方法 默认权限 目录权限 粘滞位 &#x1f340;结语 ❤️前言 大家好&#xff01;今天这篇文章主要是关于Linux操作系统下对于各种权限的理解问题&#…

AI人工智能预处理数据的方法和技术有哪些?

AI人工智能 预处理数据 在人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;领域中&#xff0c;数据预处理是非常重要的一环。它是在将数据输入到模型之前对数据进行处理和清洗的过程。数据预处理可以提高模型的准确性、可靠性和可解释性。 本文将…

Springboot +spring security,基于多种方式配置登录用户:memory、jdbc、MyBatis

一.简介 前面章节所有的用户信息(用户名和密码)都是基于配置文件配置的&#xff0c;这篇文章学习基于多种方式配置登录用户&#xff0c;比如&#xff1a; memory&#xff08;内存&#xff09;jdbcMyBatis 二.创建项目 如何创建一个SpringSecurity项目&#xff0c;前面文章已…

Python入门【序列、列表简介、列表的创建 、列表元素的增加、列表元素的删除 】(四)-全面详解(学习总结---从入门到深化)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

微服务架构初探

大家好&#xff0c;我是易安&#xff01;我们今天来谈一谈微服务架构的前世今生。 我们先来看看维基百科是如何定义微服务的。微服务的概念最早是在2014年由Martin Fowler和James Lewis共同提出&#xff0c;他们定义了微服务是由单一应用程序构成的小服务&#xff0c;拥有自己的…

chatgpt赋能Python-pythonfalse

PythonFalse&#xff1a; Python中的False值 在Python编程语言中&#xff0c;布尔(Boolean)是一种基本数据类型&#xff0c;它只有两个值&#xff1a;True和False。这篇文章将讨论Python中的False值&#xff0c;并提供有关如何使用它的指南。 什么是PythonFalse PythonFalse…

chatgpt赋能Python-pythongil

Python GIL&#xff08;全局解释器锁&#xff09;介绍 Python GIL 是全局解释器锁&#xff08;Global Interpreter Lock&#xff09;的简称&#xff0c;它是 Python 解释器中的一个重要概念。GIL 的作用是确保任何时间只有一个线程在执行 Python 指令&#xff0c;以防止多个线…

jsonmodels.model.base

欢迎来到猫子酱的学习之旅 jsonmodels.model创建模型用法验证 validate()验证器 Validators自定义验证器&#xff08;**&#xff09;默认值转换为Python结构&#xff08;和JSON&#xff09;为您的模型创建JSON模式(***) &#xff08;结合Draft7Validator&#xff09;结构和对象…

蓝桥杯单片机串口通信学习提升笔记

今日得以继续蓝桥杯国赛备赛之旅&#xff1a; 有道是 “不知何事萦怀抱&#xff0c;醒也无聊&#xff0c;醉也无聊&#xff0c;梦也何曾到谢桥。” 那我们该如何 让这位诗人纳兰 “再听乐府曲 &#xff0c;畅解相思苦”呢&#xff1f; 那就建立起串口通信吧&#xff01; 我…

论文阅读_音频表示_W2V-BERT

信息 number headings: auto, first-level 2, max 4, _.1.1 name_en: w2v-BERT: Combining Contrastive Learning and Masked Language Modeling for Self-Supervised Speech Pre-Training name_ch: W2V-BERT&#xff1a;结合对比学习和Mask语言建模进行自监督语音预训练 pape…

Redis实现全局唯一Id

Redis实现全局唯一Id 全局唯一Id简介二、Redis实现全局唯一Id实践2.1添加RedisIdWorker配置类2.2测试类 全局唯一Id简介 系统当中有些场景如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显受单表数据量的限制 场景分析&#xff1a;如果我们的id具有太明显的…