![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
每日一题
Xiami2019
这个作者很懒,什么都没留下…
展开
-
每日一题 由斜杠划分区域 LeetCode959
并查集问题,把每个单元格看作是四个小三角形,然后对各个小三角形进行合并。// 每一个单元格可以分为四个小单元格,然后根据每个位置的字符进行单元格内合并或单元格间合并class UnionFind {public: UnionFind(int n): f(n), count(n) { for (int i = 0; i < n; ++i) { f[i] = i; } } int findf(int x) {原创 2021-01-25 10:41:52 · 118 阅读 · 0 评论 -
每日一题 连通网络的操作次数 LeetCode1319
裸并查集,并根据图论知识判断,如果边数大于等于顶点数减一,就一定可以改造成连通图。// 坚韧不拔,我命由我不由天!// 因为边可以任意移动,所以只要边数大于等于计算机数减一,就一定可以连通// 所需要的最小操作数等于连通分量数减一class UnionFind {public: UnionFind(int _n): f(_n), setSize(_n, 1), n(_n), setCount(_n) { for (int i = 0; i < n; ++i) {原创 2021-01-23 09:29:20 · 138 阅读 · 1 评论 -
每日一题 连接所有点的最小费用 LeetCode1584
由完全图构建最小生成树,主要有两种方法:1. Kruskal算法;2. Prim算法;Kruskal算法需要构建并查集检查每次新添加的边构不构成回路。// 本质是求解一个完全图的最小生成树;// 使用kruskal算法需要通过并查集判断连通性,使用Prim算法则不用;// 首先需要将所有边都提取到一个边集里面,然后对边长进行排序;// 每次选取最短的边,然后通过并查集判断连通性// lion is hungryclass DisjointSet {private: vector原创 2021-01-19 23:35:22 · 171 阅读 · 0 评论 -
每日一题 账户合并 LeetCode721
这个月LeetCode真的猛出并查集,学不会并查集谁也别想走。并查集方法最重要的方法就是对问题进行建模,使得问题用连通分量表示,并且转化为判断两点是否连通的问题。然后要思考在构建并查集的过程中要如何构建并查集。哈希表加并查集需要两个哈希表,分别将邮箱映射成index和映射到对应的用户的名字。把每个用户对应的邮箱地址看成是一个连通分量。构建连通分量时只需要把accounts数组中每个用户对应的邮箱地址合并起来就好。// 并查集class UnionFind {public: UnionF原创 2021-01-18 15:04:50 · 143 阅读 · 0 评论 -
经典DP问题:最长递增子序列和最长公共子序列
LIS问题:最长递增子序列(Longest Increasing Subsequence);LCS问题:最长公共子序列(Longest Common Subsequence);子序列(subsequence)和子串(substring)的概念:子序列不要求连续,而子串必须由连续的字符组成。LIS问题时间复杂度:O(n^2);空间复杂度:O(n);设置一个DP数组,维护每个位置的符号作为结尾的最小的序列长度;class Solution {public: int lengthOfLIS原创 2021-01-18 12:18:18 · 116 阅读 · 0 评论 -
每日一题 打砖块 LeetCode803
如何计算每次击碎砖块而消失的砖块数量和顶部相连的砖块不会掉落;击碎一个砖块,可能使得其它与之连接的砖块不再与顶部相连而消失;消失的砖块数量 = 击碎之前与顶部相连的砖块数量 - 击碎之后与顶部相连的砖块数量 - 1 (1就是直接被敲碎的那块砖)并查集的按秩优化的秩即可以指当前子树的高度rank,也可以指当前集合的结点总数size,此题按size优化很huochi如何使用并查集解决这个问题?消除一个砖块的效果是:一个连通分量被分成了两个连通分量;并查集的作用是:把两个连通分量合并成一个连通分原创 2021-01-16 23:29:14 · 103 阅读 · 0 评论 -
每日一题 移除最多的同行或同列石头 LeetCode947
这是一个图论问题,首先按照题意构建图。石头作为顶点。如果两个石头位于同一行或同一列,则认为这两个石头之间有一条边,即这两个石头位于同一个连通分支之内。由题中删除石头的规则可知,实际上就是不断删除连通分支之内的顶点。而每个连通分支最后都会剩下一个顶点。所以,可以移除的最大的石头数 = 石头总数 - 连通分支数。所以题目就转化为两步,首先要构建图,然后再计算图中的连通分支数。计算连通分支数一般有两类方法,一是使用DFS或BFS之类的搜索方法,二是使用并查集的方法。这里考虑并查集的方法并查集并查集回答原创 2021-01-15 11:28:55 · 132 阅读 · 0 评论 -
每日一题 冗余连接 LeetCode 684
基本是个裸并查集的题目,从edges数组中遍历每条边,并构造并查集。如果一条边的两个顶点,则这条边就是构成回路的最后一条边。又因为无向图是由一棵树加上一条额外的边所构成的,所以显然,这样的回路只存在一个,则这样的一条边就是所求。// 并查集class Solution {public: int findf(vector<int> &f, int nodes) { if (f[nodes] != nodes) { int father原创 2021-01-13 22:09:32 · 123 阅读 · 1 评论 -
每日一题 滑动窗口最大值 LeetCode239
虽然是个做过的题,但是早上心烦意乱,基本还是纯抄leetcode题解。法一:优先队列要维护一个滑动窗口内的最大值,可以使用优先队列法,即使用一个最大堆来维护。为了判定当前最大值是否还存在于滑动窗口内,可以同时存储value和index,这样当每次向优先队列加入新元素时,可以将堆顶所有不属于当前窗口的元素都弹出,保证优先队列维持的最大元素是在滑动窗口中的元素。class Solution {public: vector<int> maxSlidingWindow(vector<原创 2021-01-12 14:31:06 · 94 阅读 · 0 评论 -
每日一题 旋转数组 LeetCode189
408牛逼数组翻转先翻转前k个,再翻转后面的,然后再整个翻转。核心就是翻转数组元素的函数。有个点要注意,要用k模一下数组长度n。class Solution {public: void reverseArray(vector<int>& nums, int start, int end) { // 对数组进行翻转 if (start >= end || start < 0 || end < 0) return; for (原创 2021-01-08 16:41:07 · 130 阅读 · 0 评论 -
每日一题 省份数量 LeetCode 547
这题的本质就是求联通分支。上一题刚刚用了并查集,再一看这题不就是一个裸并查集么。法一:并查集// 法一 并查集class Solution {public: int findf(vector<int>& f, int x) { //找一个结点的父结点; if (f[x] != x) { int father = findf(f, f[x]); f[x] = father; }原创 2021-01-08 16:18:27 · 83 阅读 · 0 评论 -
每日一题 除法求值 LeetCode 399
这道题的本质是个图论问题,应该将问题建模为一个有向图,将除法表达式的变量看作是图的顶点,除法与被除数通过弧的方向来表示,除法表达式的值看作是边的权值,所以只需判断除法表达式的两点在图中是否存在路径,并且路径上每段距离的乘积就是最终表达式的结果。法一:广度优先搜索先构造图的表达形式,这里采用临接表来存储图,然后进行广度优先搜索,如果从起点出发搜到了终点,则表示这两个点之间存在路径,则把每段路径的乘积计算出来即可。class Solution {public: vector<double&原创 2021-01-08 14:46:12 · 119 阅读 · 0 评论 -
每日一题:正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*‘的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。说明:s 可能为空,且只包含从 a-z 的小写字母。p 可能为空,且只包含从 a-z 的小写字母,以及字符 . 和 *。示例1:输入:s = “aa”p = “a”输出: false解释: “a” 无法匹配 “aa” 整个字符串。示例2:s = “aa”p .原创 2020-06-20 11:46:48 · 345 阅读 · 0 评论 -
每日一题:每日温度(Daily Temperatures)
根据每日 气温 列表,请重新生成一个列表,对应位置的输出是需要再等待多久温度才会升高超过该日的天数。如果之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。单调栈遍历整个数组,使用一个栈来作为保存数组元素.原创 2020-06-11 10:07:31 · 499 阅读 · 0 评论 -
每日一题:和可被K整除的子数组
给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。示例:输入:A = [4,5,0,-2,-3,1], K = 5输出:7解释:有 7 个子数组满足其元素之和可被 K = 5 整除:[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]遇见子数组和的相关问题,优先考虑前缀和的做法。这里因为是整除的问题,所以前缀和需要用求模后的结果表示。class Solu.原创 2020-05-28 10:02:56 · 397 阅读 · 0 评论 -
每日一题:解码字符串
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例1:s = “3[a]2[bc]”, 返回 “aaabcbc”.s = “3[a2[c.原创 2020-05-28 09:25:02 · 254 阅读 · 0 评论 -
每日一题:寻找重复数
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例1:输入: [1,3,4,2,2]输出: 2示例2:输入: [3,1,3,4,2]输出: 3说明:不能更改原数组;时间复杂度小于O(n^2);空间复杂度为O(1);数组中只有一个重复数字,但它可能不只重复出现一次;将index和nums[index]之间连一条边,即从index可以转移到nums[ind.原创 2020-05-26 15:34:19 · 334 阅读 · 0 评论 -
每日一题:验证回文字符串
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例1:输入: “aba”输出: True示例2:输入: “abca”输出: True解释: 你可以删除c字符。注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。使用贪心算法。设置两个指针分别指向字符串头和字符串尾,向中间判断是否是回文。如果第一次出现不相等,因为可以删除一个字符,所以可以再次判断[low+1, high]和[low, high - 1]这两个区间是不是回文字符串。# 贪.原创 2020-05-19 12:25:06 · 255 阅读 · 0 评论 -
每日一题:和为K的子数组
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例1:输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。说明:数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。采用前缀和的方法,依次计算每个位置的前缀和,并判断是否有减去k的前缀和出现,然后加上对应的前缀和出现的次数。class Solution {publi.原创 2020-05-15 16:04:57 · 270 阅读 · 0 评论 -
每日一题:快速幂
实现 pow(x, n) ,即计算 x 的 n 次幂函数。快速幂的基本思想就是,将指数转换成二进制形式,然后计算每一位1的贡献。class Solution {public: double quickMul(double x, long long N) { double ans = 1.0; // 贡献的初始值为x double xContribute = x; // 在对N进行二进制拆分的同时计算答案 whi.原创 2020-05-12 09:52:51 · 106 阅读 · 0 评论 -
每日一题:山脉数组中查找目标值
示例1:输入:array = [1,2,3,4,5,3,1], target = 3输出:2解释:3 在数组中出现了两次,下标分别为 2 和 5,我们返回最小的下标 2。示例2:输入:array = [0,1,2,4,2,1], target = 3输出:-1解释:3 在数组中没有出现,返回 -1。二分查找因为山脉数组由一个递增序列和一个递减序列两个单调序列组成,所以先使用二...原创 2020-04-29 11:28:48 · 157 阅读 · 0 评论 -
每日一题:数组中数字出现的次数
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2]限制:2 <= nums <= 100...原创 2020-04-28 11:17:35 · 99 阅读 · 0 评论 -
每日一题:硬币
硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)示例1:输入: n = 5输出:2解释: 有两种方式可以凑成总金额:5=55=1+1+1+1+1示例2:输入: n = 10输出:4解释: 有四种方式可以凑成总金额:10=1010=5+510=5+1+1+1+1+110...原创 2020-04-23 12:04:30 · 217 阅读 · 0 评论 -
每日一题:岛屿数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例1:输入:11110110101100000000输出: 1示例2:输入:11000110000010000011输出: 3解释: 每座岛屿只能由水...原创 2020-04-20 11:00:16 · 299 阅读 · 0 评论 -
每日一题:统计重复个数
由 n 个连接的字符串 s 组成字符串 S,记作 S = [s,n]。例如,[“abc”,3]=“abcabcabc”。如果我们可以从 s2 中删除某些字符使其变为 s1,则称字符串 s1 可以从字符串 s2 获得。例如,根据定义,“abc” 可以从 “abdbec” 获得,但不能从 “acbbe” 获得。现在给你两个非空字符串 s1 和 s2(每个最多 100 个字符长)和两个整数 0...原创 2020-04-19 15:41:36 · 128 阅读 · 0 评论 -
每日一题:Jump Game
给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到...原创 2020-04-17 11:49:38 · 134 阅读 · 0 评论 -
每日一题:矩阵
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离。两个相邻元素间的距离为 1 。示例1:输入:0 0 00 1 00 0 0输出:0 0 00 1 00 0 0/*方法一:多源广度优先搜索对于矩阵中的每一个元素,如果它的值为0,那么离它最近的0就是它自己。如果它的值为1,那么我们就需要找出离它最近的0,并且返回这个距离值。可以从0的位置...原创 2020-04-15 13:27:23 · 482 阅读 · 0 评论 -
每日一题:两数之和(链表版)
给你两个 非空 链表来代表两个非负整数。数字最高位位于链表开始位置。它们的每个节点只存储一位数字。将这两数相加会返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。进阶:如果输入链表不能修改该如何处理?换句话说,你不能对列表中的节点进行翻转。示例:输入:(7 -> 2 -> 4 -> 3) + (5 -> 6 -> 4)输出:...原创 2020-04-14 11:34:24 · 288 阅读 · 0 评论 -
每日一题:求两线段的交点
给定两条线段(表示为起点start = {X1, Y1}和终点end = {X2, Y2}),如果它们有交点,请计算其交点,没有交点则返回空值。要求浮点型误差不超过10^-6。若有多个交点(线段重叠)则返回 X 值最小的点,X 坐标相同则返回 Y 值最小的点。示例1:输入:line1 = {0, 0}, {1, 0}line2 = {1, 1}, {0, -1}输出: {0.5, ...原创 2020-04-14 11:30:00 · 398 阅读 · 0 评论 -
每日一题:鸡蛋掉落
你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X &...原创 2020-04-11 16:35:17 · 128 阅读 · 0 评论 -
每日一题:翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。示例1:输入: “the sky is blue”输出: “blue is sky the”示例2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例3:输入: “a good example”输出: “exam...原创 2020-04-11 10:47:38 · 159 阅读 · 0 评论 -
每日一题:括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。示例:输入:n = 3输出:[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”]方法一:暴力枚举枚举出括号的所有排列。为了生成所有的序列,可以使用递归的方法。长度为n的序列就是在长度为n-1的序列后面加一个“(”或“)”。class S...原创 2020-04-09 16:14:17 · 461 阅读 · 0 评论 -
每日一题:数组旋转
给你一幅由 N × N 矩阵表示的图像,其中每个像素的大小为 4 字节。请你设计一种算法,将图像旋转 90 度。不占用额外内存空间能否做到?示例1:给定 matrix =[[1,2,3],[4,5,6],[7,8,9]],原地旋转输入矩阵,使其变为:[[7,4,1],[8,5,2],[9,6,3]]示例2:给定 matrix =[[ 5, 1, 9,11]...原创 2020-04-07 14:04:18 · 140 阅读 · 0 评论 -
每日一题:编辑距离
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例1:输入:word1 = “horse”, word2 = “ros”输出:3解释:horse -> rorse (将 ‘h’ 替换为 ‘r’)rorse -> rose (删...原创 2020-04-06 21:17:45 · 143 阅读 · 0 评论 -
LFU缓存机制实现
刚学完LRU就来LFU。。。设计并实现最不经常使用(LFU)缓存的数据结构。它应该支持以下操作:get 和 put。get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。put(key, value) - 如果键不存在,请设置或插入值。当缓存达到其容量时,它应该在插入新项目之前,使最不经常使用的项目无效。在此问题中,当存在平局(即两个或更多个键具有相同使用...原创 2020-04-05 14:35:20 · 444 阅读 · 0 评论 -
每日一题:排序数组(冒泡,插入,选择,快排,归并,堆排)
给你一个整数数组 nums,请你将该数组升序排列。简单的排序题,顺便总结一下常用的排序算法。快速排序最常见的排序,面试也比较喜欢问。注意快排中的partition操作可以用来求第K大的数字。快排的思路是每次迭代把小于(大于)某个元素的数全部放在它前面,把大于(小于)某个元素的数全部放在它后面。快速排序是不稳定排序/*快速排序*/class Solution {public...原创 2020-04-04 15:16:58 · 385 阅读 · 0 评论 -
每日一题:接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6方法一:暴力法扫描数组中的每个元素,我们找出下雨后水能达到的最高位置。通过同时向左和向右找最高的墙。则当前位置的积水量就等于两边最大高度的较小值减去当前高度的值。时间复杂度:O(n^2);空间复杂度:O(1);...原创 2020-04-04 10:51:25 · 227 阅读 · 0 评论 -
每日一题:字符串转换函数atoi
请你来实现一个 atoi 函数,使其能将字符串转换成整数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。接下来的转化规则如下:如果第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字字符组合起来,形成一个有符号整数。假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成一个整数。该字符串在有效的整数部分之后也可能会存在多...原创 2020-04-03 10:22:29 · 139 阅读 · 0 评论 -
每日一题:生命游戏(简易版元胞自动机)
题目:根据 百度百科 ,生命游戏,简称为生命,是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机。给定一个包含 m × n 个格子的面板,每一个格子都可以看成是一个细胞。每个细胞都具有一个初始状态:1 即为活细胞(live),或 0 即为死细胞(dead)。每个细胞与其八个相邻位置(水平,垂直,对角线)的细胞都遵循以下四条生存定律:如果活细胞周围八个位置的活细胞数少于两个,则该位置活...原创 2020-04-02 00:49:04 · 737 阅读 · 1 评论 -
每日一题:有效括号的嵌套深度
题目太复杂了直接甩链接了https://leetcode-cn.com/problems/maximum-nesting-depth-of-two-valid-parentheses-strings/这题其实有很强的条件,所以比较简单。因为题目中说的是有效括号字符串,所以保证了括号可以匹配上。因此只需要统计每个括号的嵌套深度,然后把奇数深度的括号分到一组再把偶数深度的括号分到一组,就可以保...原创 2020-04-02 00:02:25 · 157 阅读 · 0 评论