leetcode
安牛牛牛
没有感情的刷子
展开
-
LeetCode | 1851.包含每个查询的最小区间
queries[j] 就是扫描线,查询的结果就是 queries[j] 所在位置的高度最低的矩形,如果没有矩形,返回 -1。扫面线为 4 时,最低的矩形是 1(因为区间为[4, 4], 所以只能看见一根红色的线)。把 intervals[i] 的左右两个边界当成是矩形的两条竖边的 x 坐标,矩形的高度为 right。区间的 长度 定义为区间中包含的整数数目,更正式地表达是。实现二: 用优先队列保存扫描线所在的区间,扫描线不在区间时,区间移出队列。如果不存在这样的区间,那么答案是 -1。原创 2022-11-28 15:29:54 · 554 阅读 · 1 评论 -
LeetCode | 850. 矩形面积 II
遍历到 (x1, x2) 区间时, 有 4 个矩形覆盖了这个区间:R1、R2、R3、R4;统计出来的高度为:H = (y2 - y1) + (y6 - y3) + (y8 - y7)。(R2 和 R3 重复的面积没有算,统计出来的高度是 y6 - y3, 而不是 y6 - y4 + y5 - y3)上一个遍历的区间是前一个 x 到 x1, 下一个要遍历的区间是 (x2, x3)。因为 x 坐标是根据矩形的竖边确定的,所以不会错过任何矩形的面积漏算,一定会统计出所有的面积。是该矩形 右上角 的坐标。原创 2022-11-22 22:11:42 · 362 阅读 · 0 评论 -
LeetCode | 391.完美矩形
一个完美矩形的充要条件为:对于完美矩形的每一条非边缘的竖边,都「成对」出现(存在两条完全相同的左边和右边重叠在一起);对于完美矩形的两条边缘竖边,均独立为一条连续的(不重叠)的竖边。当只有 4 个不为 0 的顶点且这 4 个顶点必须是 1 或 -1 时,矩形是完美矩形。每个矩形的左下角值为 1,左上角值为 -1,右下角值为 -1,右上角值为 1。代表竖边的上端点),同时为了区分是矩形的左边还是右边,再引入一个标识位,即以四元组。红色:边缘竖边由于只有单边,必然不重叠,且连接成一条完成的竖边。原创 2022-11-21 18:04:17 · 370 阅读 · 0 评论 -
LeetCode | 218. 天际线问题
城市的天际线是从远处观看该城市中所有建筑物形成的轮廓的外部轮廓。给你所有建筑物的位置和高度,请返回由这些建筑物形成的天际线 。每个建筑物的几何信息由数组 *buildings* 表示,其中三元组 *buildings[i] = [left~i~, right~i~, height~i~]* 表示:原创 2022-11-18 18:26:52 · 554 阅读 · 0 评论 -
LeetCode | 406. 根据身高重建队列
LeetCode | 406. 根据身高重建队列原创 2022-11-17 17:46:08 · 287 阅读 · 0 评论 -
LeetCode | 307. 区域和检索 - 数组可修改
LeetCode | 307. 区域和检索 - 数组可修改。用线段树的方式求解,写了大致的思路和贴出了代码。原创 2022-11-17 14:35:01 · 260 阅读 · 0 评论 -
实现前缀树
Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。请你实现 Trie 类:Trie() 初始化前缀树对象。void insert(String word) 向前缀树中插入字符串 word 。boolean search(String word) 如果字符串 word 在前缀树中,返回 true(即,在检索之前已经插入);否则,返回 false 。boolean startsWith(S原创 2022-02-28 16:31:05 · 139 阅读 · 0 评论 -
出现频率最高的k个数字
给定一个整数数组 nums 和一个整数 k ,请返回其中出现频率前 k 高的元素。可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]提示:1 <= nums.length <= 105k 的取值范围是 [1, 数组中不相同的元素的个数]题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的思路:类似于这种第k大、第k原创 2022-02-28 16:18:02 · 704 阅读 · 0 评论 -
矩阵中的最大矩形
给定一个由 0 和 1 组成的矩阵 matrix ,找出只包含 1 的最大矩形,并返回其面积。注意:此题 matrix 输入格式为一维 01 字符串数组。示例1:输入:matrix = [“10100”,“10111”,“11111”,“10010”]输出:6解释:最大矩形如上图所示。示例 2:输入:matrix = []输出:0示例 3:输入:matrix = [“0”]输出:0示例 4:输入:matrix = [“1”]输出:1示例 5:输入:matrix = [“00原创 2021-12-13 22:13:51 · 1168 阅读 · 0 评论 -
1~n 中整数1出现的次数
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例 :输入:n = 12输出:5输入:n = 13输出:6限制:1 <= n < 2^31思路:统计1~n中1出现的次数,可以统计1 ~ n中各个位上1出现的次数然后相加,个位上1出现的次数+十位上1出现的次数+百位上1出现的次数+ … 。数字1出现的次数:n10k+1{n} \over {10^{k+1}原创 2021-10-29 16:44:55 · 882 阅读 · 0 评论 -
剑指 Offer 38. 字符串的排列
输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s = "abc"输出:["abc","acb","bac","bca","cab","cba"]限制:1 <= s 的长度 <= 8思路:大问题分解为小问题,字符串的长度为len,固定当前字符,则当前字符固定时,字符串的全排列为剩下的len-1个字符的全排列。一直递归下去,遇到最后一个字符,保存当前字符串。因为字符会重复,所以要做一个判断,如果当前位置已经固原创 2021-10-25 13:35:15 · 74 阅读 · 0 评论 -
Find If Path Exists In Graph
There is a bi-directional graph with n vertices, where each vertex is labeled from 0 to n - 1 (inclusive). The edges in the graph are represented as a 2D integer array edges, where each edges[i] = [ui, vi] denotes a bi-directional edge between vertex ui an原创 2021-09-16 15:30:18 · 92 阅读 · 0 评论 -
包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。思路:感觉也很巧妙,开始看到题目的时候觉得不可能实现:push和pop都是O(1)的时间复杂度,说明没有遍历的过程,数据在栈中是乱序的;而min也要是O(1),说明还是不能遍历,那怎么可能从栈中取出最小的值呢?看了题解发现,可以用两个栈来维护,栈A正常存放所有的值,栈B保持从栈顶到栈底的非严格升序。每一个入栈的值,压入栈A,如果栈B为空或者这个值小于或等于B原创 2021-09-14 13:49:16 · 62 阅读 · 0 评论 -
顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]限制:0 <= matrix.length <= 1000 <= matrix[i].length <= 10原创 2021-09-14 11:40:18 · 118 阅读 · 0 评论 -
表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。数值(按顺序)可以分成以下几个部分:1.若干空格2.一个 小数 或者 整数3.(可选)一个 'e' 或 'E' ,后面跟着一个 整数4.若干空格小数(按顺序)可以分成以下几个部分:1.(可选)一个符号字符('+' 或 '-')2.下述格式之一:3.至少一位数字,后面跟着一个点 '.'4.至少一位数字,后面跟着一个点 '.' ,后面再跟着至少一位数字5.一个点 '.' ,后面跟着至少一位数字整数(按顺序)可以分成以下几个部原创 2021-09-13 16:39:16 · 120 阅读 · 0 评论 -
数值的整数次方
实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。思路:xn可以表示为(x2)n/2,当n是整数时,有两种情况:1.n是偶数:xn=(x2)n/2;2.n是奇数:xn=x*(x2)n/2double myPow(double x, int n) { if(x==0)return 0; int flag=0; long long times=n; if(times<0){ flag=1;原创 2021-09-13 14:11:02 · 89 阅读 · 0 评论 -
删除链表中的节点
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为 要被删除的节点 。示例:输入:head = [4,5,1,9], node = 5输出:[4,1,9]解释:给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.输入:head = [4,5,1,9], node = 1输出:[4,5,9]解释:给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9原创 2021-08-26 11:29:04 · 247 阅读 · 0 评论 -
移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。示例:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]输入:head = [], val = 1输出:[]输入:head = [7,7,7,7], val = 7输出:[]提示:列表中的节点数目在范围 [0, 104] 内1 <= Node.val <= 500 <= val &l原创 2021-08-23 18:12:59 · 54 阅读 · 0 评论 -
删除排序列表中重复的元素 Ⅱ
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中没有重复出现的数字。返回同样按升序排列的结果链表。示例:输入:head = [1,2,3,3,4,4,5]输出:[1,2,5]输入:head = [1,1,1,2,3]输出:[2,3]提示:链表中节点数目在范围 [0, 300] 内-100 <= Node.val <= 100题目数据保证链表已经按升序排列思路:遍历链表,如果当前节点的值和下一个节点原创 2021-08-16 15:56:42 · 110 阅读 · 0 评论 -
基本计算器
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。示例:输入:s = "1 + 1"输出:2输入:s = " 2-1 + 2 "输出:3输入:s = "(1+(4+5+2)-3)+(6+8)"输出:23提示:1 <= s.length <= 3 * 105s 由数字、’+’、’-’、’(’、’)’、和 ’ ’ 组成s 表示一个有效的表达式思路:用栈保存左括号左边的符号值,对于每个数字,相当于做了去括号的操作,计算出该数字实际表示的正负。最后,原创 2021-08-10 15:23:33 · 522 阅读 · 0 评论 -
基本计算器 Ⅱ
给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。示例:输入:s = "3+2*2"输出:7输入:s = " 3/2 "输出:1输入:s = " 3+5 / 2 "输出:5整数除法仅保留整数部分。提示:1 <= s.length <= 3 * 105s 由整数和算符 (’+’, ‘-’, ‘*’, ‘/’) 组成,中间由一些空格隔开s 表示一个 有效表达式表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1] 内题目数据保证答案原创 2021-08-10 15:05:10 · 67 阅读 · 0 评论 -
比特位计数
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。思路:首先要理解n&(n-1)是消除n的二进制中最后一个1的。i&(i-1)一定比i小,所以res[i&(i-1)]已经求出来了,i比i&(i-1)多了一个1,所以res[i]=vector<int> countBits(int n) { vector<int>res(n+1); for(int i=1原创 2021-07-02 15:21:33 · 61 阅读 · 0 评论 -
电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。示例:输入:digits = "23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]输入:digits = ""输出:[]输入:digits = "2"输出:["a","b","c"]思路:用递归模拟场景vector<string>res;vector&l原创 2021-08-09 16:11:31 · 65 阅读 · 0 评论 -
找出所有子集的异或总和再求和
一个数组的 异或总和 定义为数组中所有元素按位 XOR 的结果;如果数组为 空 ,则异或总和为 0 。例如,数组 [2,5,6] 的 异或总和 为 2 XOR 5 XOR 6 = 1 。给你一个数组 nums ,请你求出 nums 中每个 子集 的 异或总和 ,计算并返回这些值相加之 和 。注意:在本题中,元素 相同 的不同子集应 多次 计数。数组 a 是数组 b 的一个 子集 的前提条件是:从 b 删除几个(也可能不删除)元素能够得到 a 。示例:输入:nums = [1,3]输出:6原创 2021-08-09 14:53:53 · 152 阅读 · 0 评论 -
二进制手表
二进制手表顶部有 4 个 LED 代表 小时(0-11),底部的 6 个 LED 代表 分钟(0-59)。每个 LED 代表一个 0 或 1,最低位在右侧。给你一个整数 turnedOn ,表示当前亮着的 LED 的数量,返回二进制手表可以表示的所有可能时间。你可以 按任意顺序 返回答案。小时不会以零开头:例如,“01:00” 是无效的时间,正确的写法应该是 “1:00” 。分钟必须由两位数组成,可能会以零开头:例如,“10:2” 是无效的时间,正确的写法应该是 “10:02” 。示例:输入:原创 2021-08-09 13:55:59 · 169 阅读 · 0 评论