91天学算法
文章平均质量分 65
LeetCode刷题记录
这个作者很懒,什么都没留下…
展开
-
LeetCode: 239. 滑动窗口最大值(困难)
题目描述给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值提示:1 <= nums.length <= 105104 <= nums[i] <= 1041 <= k <= nums.length题解参考...原创 2021-01-06 23:12:29 · 417 阅读 · 0 评论 -
LeetCode: 74. 搜索二维矩阵(中等)
题目参考编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。题解二分法将m x n二维数组转化为一维m*n的数组。row = idx // n , col = idx % n。class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target)原创 2021-01-06 15:42:08 · 109 阅读 · 0 评论 -
LeetCode: 876. 链表的中间结点(简单)
题目描述给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。题解快慢指针法: 双指针用两个指针 slow 与 fast 一起遍历链表。slow 一次走一步,fast 一次走两步。那么当 fast 到达链表的末尾时,slow 必然位于中间。画图思考细节本题要求如果有两个中间结点,则返回第二个中间结点。此时快指针可以前进的条件是:当前快指针的结点和当前快指针的下一个结点都非空。当节点数为奇数时, slow指针移动到链表中间位置;当节点数原创 2021-01-06 15:41:07 · 103 阅读 · 0 评论 -
LeetCode: 26. 删除排序数组中的重复项(简单)
题目描述给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。题解双指针法快指针遍历数组, 慢指针记录非重复元素。class Solution {public: int removeDuplicates(vector<int>& nums) { if (nums.empty()) return 0; //原创 2021-01-06 15:40:19 · 102 阅读 · 0 评论 -
LeetCode: 1052. 爱生气的书店老板(中等)
题目描述今天,书店老板有一家店打算试营业 customers.length 分钟。每分钟都有一些顾客(customers[i])会进入书店,所有这些顾客都会在那一分钟结束后离开。在某些时候,书店老板会生气。 如果书店老板在第 i 分钟生气,那么 grumpy[i] = 1,否则 grumpy[i] = 0。 当书店老板生气时,那一分钟的顾客就会不满意,不生气则他们是满意的。书店老板知道一个秘密技巧,能抑制自己的情绪,可以让自己连续 X 分钟不生气,但却只能使用一次。请你返回这一天营业下来,最多有多少原创 2021-01-05 09:16:12 · 264 阅读 · 0 评论 -
LeetCode: 35. 搜索插入位置(简单)
题目描述给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5 输出: 2示例 2:输入: [1,3,5,6], 2 输出: 1示例 3:输入: [1,3,5,6], 7 输出: 4示例 4:输入: [1,3,5,6], 0 输出: 0题解二分查找,先设定左侧下标 left 和右侧下标 right,再计算中间下标 mid;每次根据 nu原创 2020-12-31 22:58:47 · 107 阅读 · 0 评论 -
LeetCode: 37. 解数独(困难)
题目描述编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 . 表示。提示:给定的数独序列只包含数字 1-9 和字符 .。你可以假设给定的数独只有唯一解。给定数独永远是 9x9 形式的。题解以下内容来自37. 解数独:【回溯搜索算法】详解回溯三部曲递归函数以及参数递归函数的返回值需要是bool类型,为什原创 2020-12-30 21:16:55 · 650 阅读 · 0 评论 -
LeetCode: 30. 串联所有单词的子串
题目描述给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。(word中单词只出现一次)示例 1:输入:s = “barfoothefoobarman”,words = [“foo”,“bar”]输出:[0,9]解释:从索引 0 和 9 开始的子串分别是 “barfoo” 和 “foobar” 。输出的顺序不重原创 2020-12-29 20:50:54 · 359 阅读 · 0 评论 -
LeetCode: 3. 无重复字符的最长子串(中等)
题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = “abcabcbb” 输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。示例 2:输入: s = “bbbbb” 输出: 1解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。示例 3:输入: s = “pwwkew” 输出: 3解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。请注意,你的答案必须是 子串 的长度,“pwke” 是一原创 2020-12-29 20:36:35 · 151 阅读 · 0 评论 -
LeetCode: 447. 回旋镖的数量(中等)
题目描述给定平面上 n 对互不相同的点 points ,其中 points[i] = [xi, yi] 。回旋镖是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。返回平面上所有回旋镖的数量。示例 1:输入:points = [[0,0],[1,0],[2,0]], 输出:2解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]示例 2:输入:points = [[1,1]原创 2020-12-27 11:20:56 · 313 阅读 · 0 评论 -
LeetCode: 347. 前 K 个高频元素(中等)
题目描述给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2 输出: [1,2]示例 2:输入: nums = [1], k = 1 输出: [1]题解解题思路首先遍历整个数组,并使用哈希表记录每个数字出现的次数,并形成一个[出现次数数组]。找出原数组的前 k 个高频元素,就相当于找出[出现次数数组]的前 k 大的值。最简单的做法是给[出现次数数组]排序。但由于可能有 O(N) 个不同的出现次数(其中原创 2020-12-26 16:25:11 · 192 阅读 · 0 评论 -
Leetode: 1 15 18 多数之和合集
题目描述1.两数之和给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]题解哈希表class Solution {public: vector<int> tw原创 2020-12-26 15:00:23 · 360 阅读 · 0 评论 -
LeetCode: 987. 二叉树的垂序遍历(中等)
题目描述给定二叉树,按垂序遍历返回其结点值。对位于 (X, Y) 的每个结点而言,其左右子结点分别位于 (X-1, Y+1) 和 (X+1, Y+1)。把一条垂线从 X = -infinity 移动到 X = +infinity ,每当该垂线与结点接触时,我们按从上到下的顺序报告结点的值( Y 坐标递增)。如果两个结点位置相同,则首先报告的结点值较小。按 X 坐标顺序返回非空报告的列表。每个报告都有一个结点值列表。题解遍历所有的节点,然后对所有对节点进行排序。每个节点对应一个坐标,遍历树原创 2020-12-23 09:58:17 · 148 阅读 · 0 评论 -
LeetCode:297. 二叉树的序列化与反序列化(困难)(剑指 Offer 37)
题目描述序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。题解题意: 把二叉树转化为一个字符串,并且原创 2020-12-22 20:51:52 · 98 阅读 · 0 评论 -
LeetCode:513. 找树左下角的值(中等)
题目描述给定一个二叉树,在树的最后一行找到最左边的值。题解以下分析来自513. 找树左下角的值:【递归】【迭代】详解题解1:递归法那么如果找最左边的呢?可以使用前序遍历,这样才先优先左边搜索,然后记录深度最大的叶子节点,此时就是树的最后一行最左边的值。注意: 首先判断根结点的左子树首否为空,更新树的最大高度,并以树的最大高度来判断是否需要更新最后一行最左边的值。递归三部曲:确定递归函数的参数和返回值参数必须有要遍历的树的根节点,还有就是一个int型的变量用来记录最长深度。 这里就不需要原创 2020-12-20 10:16:49 · 117 阅读 · 1 评论 -
LeeCode:129. 求根到叶子节点数字之和(中等)
题目描述给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。题解题解1:递归以下内容分析自129. 求根到叶子节点数字之和【递归中隐藏着回溯】详解递归三部曲确定递归函数参数和返回值参数:二叉树的根节点。返回值:无返回值。注: 如果需要搜索整颗二叉树,那么递归函数就不要返回值,如果要搜索其中原创 2020-12-19 17:38:32 · 114 阅读 · 1 评论 -
LeetCode:100. 相同的树(简单)
题目描述给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。题解题解1:递归以下分析来自100. 相同的树:【递归】【迭代】详解!递归三部曲确定递归函数的参数和返回值要比较的是两个树是否是相互相同的,参数也就是两个树的根节点。返回值自然是bool类型。确定终止条件要比较两个节点数值相不相同,首先要把两个节点为空的情况弄清楚!否则后面比较数值的时候就会操作空指针了。确定单层递归的逻辑比较二叉树是否相同 :传入的是tree原创 2020-12-19 15:08:06 · 94 阅读 · 2 评论 -
LeetCode: 104. 二叉树的最大深度(简单)
题目描述给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。题解参考原创 2020-12-17 11:12:45 · 125 阅读 · 0 评论 -
LeetCode:146. LRU 缓存机制(中等)
题目描述运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCache(int capacity) 以正整数作为容量 capacity 初始化 LRU 缓存。int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。void put(int key, int value) 如果关键字已经存在,则变更其数据值;如果关键字不存在,则插入该组【关键字-值】。当缓存容量达到上限时,它应该在写入新数据原创 2020-12-16 10:31:06 · 139 阅读 · 0 评论 -
LeetCode:142. 环形链表 II(中等)
题目描述给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意,pos 仅仅是用于标识环的情况,并不会作为参数传递到函数中。说明:不允许修改给定的链表。进阶:你是否可以使用 O(1) 空间解决此题?题解题解1:哈希表使用来判断链表中是否存在环(重复元素)。/** * Definition for singly-lin原创 2020-12-14 12:57:48 · 99 阅读 · 0 评论 -
LeetCode:160. 相交链表(简单)
题目描述编写一个程序,找到两个单链表相交的起始节点。如下面的两个链表:题解创建两个指针 pa 和 pb,分别初始化为链表 A 和 B 的头结点。然后让它们向后逐结点遍历。当 pa到达链表A的尾部时,将它重定位到链表 B 的头结点;当 pb 到达链表的尾部时,将它重定位到链表 A 的头结点。若在某一时刻 pa和 pb 相遇,则 pa/pb 为相交结点。(这种情况默认链交点后面的元素一样。若输入A=[1,3,5], B=[3,4] 则不满足要求)/** * Definition for si原创 2020-12-14 10:29:47 · 92 阅读 · 0 评论 -
LeetCode:24. 两两交换链表中的节点(中等)
题目描述给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:输入:head = [1,2,3,4], 输出:[2,1,4,3]示例 2:输入:head = [],输出:[]示例 3:输入:head = [1],输出:[1]提示:链表中节点的数目在范围 [0, 100] 内, 0 <= Node.val <= 100题解创建哑结点 dummyHead,令 dummyHead.next = head原创 2020-12-13 16:29:57 · 116 阅读 · 0 评论 -
LeetCode:109. 有序链表转换二叉搜索树(中等)
题目描述给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1。题解二叉查找树(英语:Binary Search Tree),也称为二叉搜索树、有序二叉树(ordered binary tree)或排序二叉树(sorted binary tree),是指一棵空树或者具有下列性质的二叉树:(来源维基百科)若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若任意节点的右子树不原创 2020-12-13 16:10:00 · 121 阅读 · 0 评论 -
LeetCode:61. 旋转链表(中等)
题目描述给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。示例 1:输入: 1->2->3->4->5->NULL, k = 2, 输出: 4->5->1->2->3->NULL解释:向右旋转 1 步: 5->1->2->3->4->NULL, 向右旋转 2 步: 4->5->1->2->3->NULL示例 2:输入: 0->1->原创 2020-12-12 23:39:05 · 176 阅读 · 0 评论 -
LeetCode:768. 最多能完成排序的块II (困难)
题目描述这个问题和“最多能完成排序的块”相似,但给定数组中的元素可以重复,输入数组最大长度为2000,其中的元素最大为108。arr是一个可能包含重复元素的整数数组,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?示例 1:输入: arr = [5,4,3,2,1]输出: 1解释:将数组分成2块或者更多块,都无法得到所需的结果。例如,分成 [5, 4], [3, 2, 1] 的结果是 [4, 5原创 2020-12-10 19:23:27 · 290 阅读 · 0 评论 -
LeetCode:769. 最多能完成排序的块(中等)
题目描述数组arr是[0, 1, …, arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?示例 1:输入: arr = [4,3,2,1,0]输出: 1解释:将数组分成2块或者更多块,都无法得到所需的结果。例如,分成 [4, 3], [2, 1, 0] 的结果是 [3, 4, 0, 1, 2],这不是有序的数组。示例 2:输入: arr = [1,0,2原创 2020-12-10 10:55:52 · 116 阅读 · 0 评论 -
LeetCode:232. 用栈实现队列(简单)
题目描述请你仅使用两个栈实现先入先出队列。队列应当支持一般队列的支持的所有操作(push、pop、peek、empty):实现 MyQueue 类:void push(int x) 将元素 x 推到队列的末尾int pop() 从队列的开头移除并返回元素int peek() 返回队列开头的元素boolean empty() 如果队列为空,返回 true ;否则,返回 false说明:你只能使用标准的栈操作 —— 也就是只有 push to top, peek/pop from top,原创 2020-12-10 09:59:48 · 144 阅读 · 0 评论 -
LeetCode:394. 字符串解码(中等)
题目描述给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例 1:输入:s = “3[a]2[bc]”输出:“aaabcbc”示例 2:输入原创 2020-12-08 21:08:22 · 177 阅读 · 0 评论 -
LeetCode:1381. 设计一个支持增量操作的栈(中等)
题目描述请你设计一个支持下述操作的栈。实现自定义栈类 CustomStack:CustomStack(int maxSize):用 maxSize 初始化对象,maxSize 是栈中最多能容纳的元素数量,栈在增长到 maxSize 之后则不支持 push 操作。void push(int x):如果栈还未增长到 maxSize ,就将 x 添加到栈顶。int pop():弹出栈顶元素,并返回栈顶的值,或栈为空时返回 -1 。void inc(int k, int val):栈底的 k 个元素的原创 2020-12-07 11:49:12 · 117 阅读 · 0 评论 -
LeetCode:821. 字符的最短距离(简单)
题目描述给定一个字符串 S 和一个字符 C。返回一个代表字符串 S 中每个字符到字符串 S 中的字符 C 的最短距离的数组。示例 1:输入: S = “loveleetcode”, C = ‘e’ 输出: [3, 2, 1, 0, 1, 0, 0, 1, 2, 2, 1, 0]说明:字符串 S 的长度范围为 [1, 10000]。C 是一个单字符,且保证是字符串 S 里的字符。S 和 C 中的所有字母均为小写字母。题解题解1记录字符串S中字符C出现的位置,判断字符串中每一个元素与字符原创 2020-12-06 22:03:35 · 151 阅读 · 0 评论 -
LeetCode:66. 加一(简单)
题目描述给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。示例 1: 输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123。示例 2: 输入:digits= [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321。示例 3: 输入:digits = [0] 输出:[1]题解对数组中数字进行分析,加1原创 2020-12-05 22:32:46 · 166 阅读 · 0 评论