Leetcode-76 最小覆盖子串
LeetCode 76: 最小覆盖子串本题是Leetcode hot100字符串专题的最后一题,难度为hard。
问题描述给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
示例输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
注意:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
注意:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例 1:
123输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"解释:最小覆盖子串 "BANC" 包含来自字符串 t 的 'A'、'B' 和 'C'。
示例 2:
123输入:s = "a", t = &quo ...
Leetcode-11 盛最多水的容器
LeetCode 11: 盛最多水的容器这是一道标准的双指针应用题,基本上看到题目第一时间就会想到用双指针来解。本文将详细讨论如何解决LeetCode上的一道热门问题——盛最多水的容器,同时展示如何通过双指针技巧解决此问题。
问题描述给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
示例输入: [1,8,6,2,5,4,8,3,7] 输出: 49
思路分析解决这个问题的关键是理解短板效应,并且有效更新最大水量。这里,我们采用双指针法:
左指针(fast):限定左边边界,当为短板时向后移动。
右指针(slow):限定右边边界,当为短板时向前移动。
通过这种方式,我们能够在一次遍历中解决问题,同时保持代码的简洁性和效率。
代码实现12345678910111213class Solution {public: int maxArea(vector<i ...
Leetcode-283 移动零
LeetCode 283: 移动零在解决算法问题时,能够清晰地表达思路和解决方案是至关重要的。本文将详细讨论如何解决LeetCode上的一道热门问题——移动零,同时展示如何通过双指针技术高效解决此问题。
问题描述给定一个数组 nums,编写一个函数将所有 0 移动到它的末尾,同时保持非零元素的相对顺序。
示例输入: [0,1,0,3,12] 输出: [1,3,12,0,0]
注意:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
思路分析解决这个问题的关键是如何在遍历数组的同时,有效地将非零元素移至数组前端,而把零移至末尾,且最小化移动次数。这里,我们采用双指针法:
快指针(fast):遍历数组。
慢指针(slow):指向当前非零元素应当插入的位置。
通过这种方式,我们能够在一次遍历中解决问题,同时保持代码的简洁性和效率。
代码实现1234567891011void moveZeroes(vector<int>& nums) { int slow = 0; for (int fast = 0; fast < num ...
Leetcode-128 最长连续序列
Leetcode
本题是Leetcode Hot100中哈希表最后一道题,个人觉得难度比两数之和&&字母异位词分组高一点,但经过前两题的训练,这一题想到用哈希表并不算困难。老规矩,先遍历。
123for (auto &item: nums) {}
对于数组中遍历的每一个元素item,想要知道他是否连续,很自然的,我们会想到在数组中看一看是否存在item-1和item+1。但我们知道,数组是没有前瞻性的,我们在没有遍历到后面的元素时,根本无法预知到它的值,所以理所当然地,如果当前被遍历的元素不存在前一个数,我们就可以将其作为起始值,将所有元素通通存储在哈希表中,不断查询起始值++,一旦查不到连续的下一个就可以结束,更新长度。话不多说,直接上代码,疑难点笔者会给出注释。
1234567891011121314151617// 因为只要存储数值,不用存储下标,非二元组就不需要用map来存储了,改用set// 下面这条语句的用法,是在创建哈希表的同时,从头到尾复制nums作为哈希表的元素unordered_set<int> heap(n ...
Leetcode-049 字母异位词分组
Leetcode
所谓的字母异位词,其意思是不同的单词本质上只是相同的单词打乱顺序,这类单词就是字母异位词。
对于一部分同学来说,可能并不清楚字符串string在c++中是个容器,而容器基本上都是可以对内容进行排序的。所以字母异位词的打乱顺序在排序面前形同虚设。在知道这个知识点以后,我们理所当然地可以想到,对每一个字符串进行排序,排完序之后如果是一样的,那这些字符串就是我们需要的答案。
1sort(str.size(), str.end());
话不多说,直接开始遍历。
123for (auto &str: strs) { }
这种遍历方式对于初学者来说可能不好理解,如果有疑问可以在discussion中评论,暂时你只需要知道auto是c++自动推断变量类型的工具,而for循环中就是把strs数组中的每一个字符串拿出来,这个字符串叫str。当我们遍历得到当前的字符串时,千万不能直接对其排序,因为我们最终输出的答案还得是排序之前被打乱过顺序的字符串。所以我们找一个临时变量x来保存字符串内容。
1234for (auto &str: strs) ...
Leetcode-01 两数之和
Leetcode
两数之和作为Leetcode序列号为1的题目,对新手具有十足的劝退性。 如果暴力求解,用两重循环不断遍历,这可能是自然而然的思路,但写起来也并不好写。 本题的官方标签是”哈希表”, 所以本篇题解只讨论用哈希表来求解此题。 对于很多同学来说,会不会哈希先放在一边,为什么会想到用哈希表才是头疼的地方。 那么我们可以先不先入为主地考虑哈希,来分析一下这道题: 首先,写第一个for循环来遍历这个数组来查看每一个值是自然而然的想法。
123for (int i = 0; i < nums.size(); ++i) { ……}
就示例1而言,当i为0的时候,我们遍历到nums[0] :2,它是否是答案呢?不知道。我们需要继续向后遍历。 当i为1的时候,我们遍历到nums[1]:7,它是否是答案呢? 当然,它加上前面的2就是我们的target:9,但问题来了:作为人类,你当然可以向前看一个,但是作为程序,它并没有”回头看”的能力。既然如此,我们就必须为程序创造一个用来记忆的东西。 这种记忆能力需要什么呢? 第 ...