算法
一只不吃老鼠的猫
我们一路奋战,不是为了改变世界,而是为了不让世界改变我们!
展开
-
寒假每日一题——找出星型图的中心节点
题目链接:https://leetcode-cn.com/problems/find-center-of-star-graph/题目描述有一个无向的 星型 图,由 n 个编号从 1 到 n 的节点组成。星型图有一个 中心 节点,并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。给你一个二维整数数组 edges ,其中 edges[i] = [ui, vi] 表示在节点 ui 和 vi 之间存在一条边。请你找出并返回 edges 所表示星型图的中心节点。示例输入:edges.原创 2022-02-18 12:23:08 · 190 阅读 · 0 评论 -
寒假每日一题——跳跃游戏
题目链接:https://leetcode-cn.com/problems/jump-game/题目描述给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。示例输入:nums = [2,3,1,1,4]输出:true解释:可以先跳 1 步,从下标 0 到达下标 1, 然后再从下标 1 跳 3 步到达最后一个下标。思路设定一个dp数组,dp[i]表示在下标i处能够跳跃的最大.原创 2022-02-17 14:06:40 · 2719 阅读 · 0 评论 -
寒假每日一题——二叉树的最小深度
题目链接:https://leetcode-cn.com/problems/lucky-numbers-in-a-matrix/题目描述给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。题目链接输入:root = [3,9,20,null,null,15,7]输出:2思路使用 BFS求最短路径。也可以使用递归,比较容易实现。下边给出bfs的代码。代码public int minDepth.原创 2022-02-16 12:30:41 · 134 阅读 · 0 评论 -
寒假每日一题——矩阵中的幸运数
题目链接:https://leetcode-cn.com/problems/lucky-numbers-in-a-matrix/题目描述给你一个 m * n 的矩阵,矩阵中的数字 各不相同 。请你按 任意 顺序返回矩阵中的所有幸运数。幸运数是指矩阵中满足同时下列两个条件的元素:在同一行的所有元素中最小在同一列的所有元素中最大示例输入:matrix = [[3,7,8],[9,11,13],[15,16,17]]输出:[15]解释:15 是唯一的幸运数,因为它是其所在行中的最小.原创 2022-02-15 13:10:50 · 450 阅读 · 0 评论 -
寒假每日一题——有序数组中的单一元素
题目链接:https://leetcode-cn.com/problems/single-element-in-a-sorted-array/题目描述给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次。请你找出并返回只出现一次的那个数。示例输入: nums = [1,1,2,3,3,4,4,8,8]输出: 2思路利用异或运算的性质。0 ⊕ n = n 0与 n 进行异或运算等于 nn ⊕ n = 0 任意两个相同的数进行异.原创 2022-02-14 13:22:41 · 198 阅读 · 0 评论 -
寒假每日一题——气球的最大数量
题目链接:https://leetcode-cn.com/problems/maximum-number-of-balloons/题目描述给你一个字符串 text,你需要使用 text 中的字母来拼凑尽可能多的单词 "balloon"(气球)。字符串 text 中的每个字母最多只能被使用一次。请你返回最多可以拼凑出多少个单词 "balloon"。示例输入:text = "loonbalxballpoon"输出:2思路统计字母 b,a,l,o,n的出现次数,选取出现次数最少.原创 2022-02-13 13:18:29 · 477 阅读 · 0 评论 -
寒假每日一题——飞地的数量
题目链接:https://leetcode-cn.com/problems/number-of-enclaves/题目描述给你一个大小为 m x n 的二进制矩阵 grid ,其中 0 表示一个海洋单元格、1 表示一个陆地单元格。一次 移动 是指从一个陆地单元格走到另一个相邻(上、下、左、右)的陆地单元格或跨过 grid 的边界。返回网格中 无法 在任意次数的移动中离开网格边界的陆地单元格的数量。示例输入:grid = [[0,0,0,0],[1,0,1,0],[0,1,1,0].原创 2022-02-12 14:32:25 · 105 阅读 · 0 评论 -
寒假每日一题——学生分数的最小差值
题目链接:https://leetcode-cn.com/problems/minimum-difference-between-highest-and-lowest-of-k-scores/题目描述给你一个 下标从 0 开始 的整数数组 nums ,其中 nums[i] 表示第 i 名学生的分数。另给你一个整数 k 。从数组中选出任意 k 名学生的分数,使这 k 个分数间 最高分 和 最低分 的 差值 达到 最小化 。返回可能的 最小差值 。示例 输入:nums = [9,4,1.原创 2022-02-11 14:07:15 · 730 阅读 · 0 评论 -
寒假每日一题——最简分数
题目链接:https://leetcode-cn.com/problems/simplified-fractions/题目描述给你一个整数 n ,请你返回所有 0 到 1 之间(不包括 0 和 1)满足分母小于等于 n 的 最简 分数 。分数可以以 任意 顺序返回。示例输入:n = 4输出:["1/2","1/3","1/4","2/3","3/4"]解释:"2/4" 不是最简分数,因为它可以化简为 "1/2" 。思路枚举分子和分母,并判断两个数是否为最简(即最大公约数是.原创 2022-02-10 13:33:15 · 520 阅读 · 0 评论 -
寒假每日一题——差的绝对值为K的数对数目
题目链接:https://leetcode-cn.com/problems/count-number-of-pairs-with-absolute-difference-k/题目描述给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。|x| 的值定义为:如果 x >= 0 ,那么值为 x 。如果 x < 0 ,那么值为 -x 。示例输入:nums = [1,2.原创 2022-02-09 15:02:19 · 543 阅读 · 0 评论 -
寒假每日一题——盛最多水的容器
题目链接:https://leetcode-cn.com/problems/container-with-most-water/题目描述给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。说明:你不能倾斜容器。示例输入:[1,8,6,2,5,4,8,3,7]输出:49 解释:图中垂.原创 2022-02-08 12:41:48 · 116 阅读 · 0 评论 -
寒假每日一题——最长快乐字符串
题目链接:https://leetcode-cn.com/problems/longest-happy-string/题目描述如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s: s 是一个尽可能长的快乐字符串。 s 中 最多 有a 个字母 'a'、b 个字母 'b'、c 个字母 'c' 。 s 中只含有 'a'、'b' 、.原创 2022-02-07 12:49:40 · 295 阅读 · 0 评论 -
寒假每日一题——唯一元素的和
题目链接:https://leetcode-cn.com/problems/sum-of-unique-elements/题目描述给你一个整数数组 nums 。数组中唯一元素是那些只出现 恰好一次 的元素。请你返回 nums 中唯一元素的 和 。示例输入:nums = [1,2,3,2]输出:4解释:唯一元素为 [1,3] ,和为 4 。思路统计每个单词出现的次数,找到出现次数为1的即可。代码public int sumOfUnique(int[] nums) {.原创 2022-02-06 13:02:19 · 352 阅读 · 0 评论 -
寒假每日一题——黄金矿工
题目链接:https://leetcode-cn.com/problems/path-with-maximum-gold/题目描述你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。为了使收益最大化,矿工需要按以下规则来开采黄金:每当矿工进入一个单元,就会收集该单元格中的所有黄金。矿工每次可以从当前位置向上下左右四个方向走。每个单元格只能被开.原创 2022-02-05 12:01:43 · 189 阅读 · 0 评论 -
寒假每日一题——可以形成最大正方形的矩形数目
题目链接:https://leetcode-cn.com/problems/number-of-rectangles-that-can-form-the-largest-square/题目描述给你一个数组 rectangles ,其中 rectangles[i] = [li, wi] 表示第 i 个矩形的长度为 li 、宽度为 wi 。如果存在 k 同时满足 k <= li 和 k <= wi ,就可以将第 i 个矩形切成边长为 k 的正方形。例如,矩形 [4,6] 可以切成边长最.原创 2022-02-04 13:51:09 · 798 阅读 · 0 评论 -
寒假每日一题——和为 K 的最少斐波那契数字数目
题目链接:https://leetcode-cn.com/problems/find-the-minimum-number-of-fibonacci-numbers-whose-sum-is-k/题目描述给你数字 k ,请你返回和为 k 的斐波那契数字的最少数目,其中,每个斐波那契数字都可以被使用多次。示例输入:k = 7输出:2 解释:斐波那契数字为:1,1,2,3,5,8,13,……对于 k = 7 ,我们可以得到 2 + 5 = 7 。思路—贪心算法首先记录所有小于k.原创 2022-02-03 11:50:48 · 677 阅读 · 0 评论 -
寒假每日一题——反转单词前缀
题目链接:https://leetcode-cn.com/problems/reverse-prefix-of-word/题目描述给你一个下标从 0 开始的字符串 word 和一个字符 ch 。找出 ch 第一次出现的下标 i ,反转 word 中从下标 0 开始、直到下标 i 结束(含下标 i )的那段字符。如果 word 中不存在字符 ch ,则无需进行任何操作。示例输入:word = "abcdefd", ch = "d"输出:"dcbaefd"解释:"d" 第一次出现在下标 .原创 2022-02-02 13:41:27 · 518 阅读 · 0 评论 -
寒假每日一题——最长的美好子字符串
今天是大年初一,大家新年快乐。祝大家在新的一年里学业顺利,代码无bug。题目链接:https://leetcode-cn.com/problems/longest-nice-substring/题目描述当一个字符串 s 包含的每一种字母的大写和小写形式 同时 出现在 s 中,就称这个字符串 s 是 美好 字符串。比方说,"abABB" 是美好字符串,因为 'A' 和 'a' 同时出现了,且 'B' 和 'b' 也同时出现了。然而,"abA" 不是美好字符串因为 'b' 出现了,而 'B' .原创 2022-02-01 13:02:00 · 460 阅读 · 0 评论 -
寒假每日一题——将数字变成0的操作次数
祝大家除夕快乐,在新的一年里学业进步,事业有成,天天好心情。题目链接:https://leetcode-cn.com/problems/number-of-steps-to-reduce-a-number-to-zero/题目描述给你一个非负整数 num ,请你返回将它变成 0 所需要的步数。 如果当前数字是偶数,你需要把它除以 2 ;否则,减去 1 。示例输入:num = 14输出:6解释:步骤 1) 14 是偶数,除以 2 得到 7 。步骤 2) 7 是奇数,减 1 得到.原创 2022-01-31 10:25:50 · 381 阅读 · 0 评论 -
寒假每日一题——两句话中的不常见单词
题目链接:https://leetcode-cn.com/problems/uncommon-words-from-two-sentences/题目描述句子 是一串由空格分隔的单词。每个 单词 仅由小写字母组成。如果某个单词在其中一个句子中恰好出现一次,在另一个句子中却 没有出现 ,那么这个单词就是 不常见的 。给你两个 句子 s1 和 s2 ,返回所有 不常用单词 的列表。返回列表中单词可以按 任意顺序 组织。示例输入:s1 = "this apple is sweet", s2.原创 2022-01-30 13:19:21 · 5650 阅读 · 0 评论 -
寒假每日一题——只出现一次的数字
题目链接:https://leetcode-cn.com/problems/single-number/题目描述给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。示例输入: [2,2,1]输出: 1思路题目要求不使用额外空间,因此往位运算上想。这道题可以使用异或运算来写,特点如下:任何数和 0 做异或运算,结果仍然是原来的数,即 a⊕0=a。任何数和其自身做异或运算,结果是 0,即 a⊕a=0。异或运算满足交换律和结合.原创 2022-01-29 11:56:47 · 541 阅读 · 0 评论 -
寒假每日一题——2的幂
题目链接:https://leetcode-cn.com/problems/power-of-two/题目描述给你一个整数 n,请你判断该整数是否是 2 的幂次方。如果是,返回 true ;否则,返回 false 。示例输入:n = 1输出:true解释:2^0 = 1思路这道题是简单题,使用循环或递归很容易写出来。那么能不能不使用这两种方法吗,答案是肯定的。我们使用位运算来求解。如果一个数是2的幂次方,那么将它转换成二进制数之后,只有一位 为1 ,其他全为 0。基于这个,.原创 2022-01-28 12:36:19 · 330 阅读 · 0 评论 -
寒假每日一题——三角形最小路径和
题目链接:https://leetcode-cn.com/problems/triangle/题目描述给定一个三角形 triangle ,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是下标与上一层结点下标相同或者等于上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。示例输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]输出:.原创 2022-01-27 13:59:23 · 606 阅读 · 0 评论 -
寒假每日一题——字母大小写全排列
题目链接:https://leetcode-cn.com/problems/letter-case-permutation/题目描述给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。示例输入:S = "a1b2"输出:["a1b2", "a1B2", "A1b2", "A1B2"]输入:S = "3z4"输出:["3z4", "3Z4"]输入:S = "12345"输出:["12345"]思路看到集合,.原创 2022-01-26 13:29:37 · 164 阅读 · 0 评论 -
寒假每日一题——反转链表
题目链接:https://leetcode-cn.com/problems/reverse-linked-list/题目描述给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。示例输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]思路一 迭代假设链表为 1→2→3→∅,我们想要把它改成 ∅←1←2←3。在遍历链表时,将当前节点的 next 指针改为指向前一个节点。由于节点不能指向前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需.原创 2022-01-25 16:42:53 · 297 阅读 · 0 评论 -
寒假每日一题——腐烂的橘子
题目链接:https://leetcode-cn.com/problems/rotting-oranges/题目描述在给定的网格中,每个单元格可以有以下三个值之一: 值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。每分钟,任何与腐烂的橘子(在 4 个正方向上)相邻的新鲜橘子都会腐烂。返回直到单元格中没有新鲜橘子为止所必须经过的最小分钟数。如果不可能,返回 -1。示例输入:[[2,1,1],[1,1,0],[0,1,1]]输出:4.原创 2022-01-24 13:12:10 · 334 阅读 · 0 评论 -
寒假每日一题——填充每个节点的下一个右侧节点指针
题目链接:https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/题目描述给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 n.原创 2022-01-23 12:44:51 · 89 阅读 · 0 评论 -
寒假每日一题——岛屿的最大面积
题目链接:https://leetcode-cn.com/problems/max-area-of-island/题目描述给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。示例输入.原创 2022-01-22 12:05:14 · 563 阅读 · 0 评论 -
寒假每日一题——字符串的排列
题目链接:https://leetcode-cn.com/problems/permutation-in-string/题目描述给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。换句话说,s1 的排列之一是 s2 的子串 。示例输入:s1 = "ab" s2 = "eidbaooo"输出:true解释:s2 包含 s1 的排列之一 ("ba").思路看到子串匹配问题,首先想到滑动窗口。之前.原创 2022-01-21 12:33:59 · 381 阅读 · 0 评论 -
寒假每日一题——删除链表的倒数第n个节点
题目链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/题目描述给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。示例输入:head = [1,2,3,4,5], n = 2输出:[1,2,3,5]思路之前在 双指针技巧 这篇文章中有寻找单链表倒数第k个节点的相关内容,忘了的小伙伴可以去看一下。但是这道题的要求是删除倒数第k个节点,因此我们需要找到要删除的前一个节点。具体.原创 2022-01-20 12:58:20 · 371 阅读 · 0 评论 -
寒假每日一题——存在重复元素II
题目链接:https://leetcode-cn.com/problems/contains-duplicate-ii/题目描述给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。提示:1 <= nums.length <= 10^5-10^9 <= nums[i] <= 10^9.原创 2022-01-19 12:55:24 · 366 阅读 · 0 评论 -
寒假每日一题——移动零
题目链接:https://leetcode-cn.com/problems/move-zeroes/题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。要求:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。示例输入: [0,1,0,3,12]输出: [1,3,12,0,0]思路使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对.原创 2022-01-18 14:25:27 · 92 阅读 · 0 评论 -
寒假每日一题——轮转数组
轮转数组题目链接:https://leetcode-cn.com/problems/rotate-array/题目描述给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数示例输入: nums = [1,2,3,4,5,6,7], k = 3输出: [5,6,7,1,2,3,4]解释:向右轮转 1 步: [7,1,2,3,4,5,6]向右轮转 2 步: [6,7,1,2,3,4,5]向右轮转 3 步: [5,6,7,1,2,3,4]思路当我们将数原创 2022-01-17 13:24:17 · 368 阅读 · 0 评论 -
洗牌算法详解
洗牌算法含义将数组中的数随机打乱,每次打乱后出现的概率应该是均等的。思路对于下标 x 而言,我们从 [x,n−1] 中随机出一个位置与 x 进行值交换,当所有位置都进行这样的处理后,我们便得到了一个公平的洗牌方案。代码实现int n = nums.length;Random random = new Random();for (int i = 0; i < n; i++) { //要交换数的下标 int j = i+random.nextInt(n-i)原创 2021-12-29 16:22:35 · 463 阅读 · 0 评论 -
拓扑排序详解
拓扑排序参考文章:拓扑排序,YYDSJava 简单好理解的拓扑排序1. 简介对一个有向无环图(Directed Acyclic Graph简称DAG) G 进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。如图所示接下来通过一道题 课程表II ,来理解拓扑排序的应用场景和使用方法。2. 课程表II题目描述现在你总共有 numCourses 门课需要选,记为 0 到 numCou原创 2021-12-06 19:42:53 · 499 阅读 · 0 评论 -
单调栈模板
单调栈参考文章:单调栈题解秒杀三道算法题顾名思义,单调栈本质是一个栈。只不过里面的元素是单调递增或者递减的。它的用途不是很广泛,只处理一种叫做Next Greater Element的典型问题。1. 下一个更大元素题目描述给定一个数组,返回一个等长的数组,对应索引存储着下一个更大的元素值。如果没有更大的元素,返回-1。这是一个典型的Next Greater Element问题,因此使用单调栈模板来解决。vector<int> nextGreaterElement(vec原创 2021-12-04 15:06:58 · 875 阅读 · 0 评论 -
滑动窗口算法
滑动窗口算法参考文章:https://labuladong.gitee.io/algo/1/9/1. 模板滑动窗口算法主要解决子串(匹配)问题。 接下来给出滑动窗口算法的模板。以后遇到子串问题,直接套用模板即可。void slidingwindow(string s ,string t){ unordered_map<char,int>need, window; for (char c: t) //如果c不存在,会自动创建key,并把map[key]赋原创 2021-12-02 15:18:37 · 693 阅读 · 0 评论 -
双指针技巧
本文主要介绍了双指针的一些使用技巧,以及二分查找的模板。原创 2021-12-01 18:03:36 · 808 阅读 · 0 评论 -
前缀和模板
前缀和1.一维数组前缀和以力扣第303道题为例。题目描述如下:给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i、j 两点。正常思路是遍历数组,将nums[i]到nums[j]的数字相加,时间复杂度为O(n)。那么有没有办法将时间复杂度降为O(1)呢?答案是肯定的,就是前缀和。所谓前缀和,就是 nums[i]之前全部元素的和。 用一个数组(preSum)存储前缀和,那么这题就变成了preSum[j]-preSum[i]。接下来就用代码实现前缀和。//前缀和原创 2021-11-25 17:38:04 · 199 阅读 · 0 评论 -
背包问题模板
背包问题模板模板参考地址:https://leetcode-cn.com/problems/combination-sum-iv/solution/xi-wang-yong-yi-chong-gui-lu-gao-ding-bei-bao-wen-/背包问题具备的特征 : 给定一个target ( 数字或者字符串),再给定一个数组 nums(数字或字符串),问:能否使用nums中的元素做各种排列组合得到target。背包问题模板:如果是0-1背包,即数组中的元素不可重复使用。for (int原创 2021-11-25 17:35:21 · 163 阅读 · 0 评论