leetcode 算法题
文章平均质量分 65
刷题
不搞数学的汤老师
不是各位卷死在下,就是在下卷死各位!
展开
-
数组中重复的数字
剑指 Offer 03. 数组中重复的数字找出数组中重复的数字。在一个长度为 nnn 的数组 nums 里的所有数字都在 0~n−10~n-10~n−1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 解法一:排序思路排序后重复的元素会扎堆在一起,然后遍历一遍即可。复杂度时间复杂度:O(nlogn)O(nlogn)O(nlogn)。排序。原创 2021-12-31 13:04:16 · 409 阅读 · 0 评论 -
动态规划:(一)线性 DP —— 3. 状态机模型
状态机模型leetcode 打家劫舍系列和买卖股票系列例题:打家劫舍、打家劫舍 II、买卖股票的最佳时机含手续费、最佳买卖股票时机含冷冻期、买卖股票的最佳时机 IV原创 2022-04-30 21:08:49 · 388 阅读 · 0 评论 -
刷透二分:(二)猜数检验
题型还在整理,整理完毕后再更新 😃前言模版还是while (l < r) { int mid = l + r >> 1; if (check(mid)) l = mid + 1; else r = mid; }while (l < r) { int mid = l + r + 1 >> 1; if (check(mid)) l = mid; else r = mid - 1;}while (l <.原创 2022-04-23 11:37:13 · 772 阅读 · 0 评论 -
刷透二分:(一)二分模版应用
前言二分无需数组有序,只需要找一个性质(二段性),能一次刷掉一半的数,就能使用二分。本文展示二分模版应用,很多题的最优解并不是二分,甚至有二分解比最优解还要难想的情况。但是为了加强对二分使用,都强制使用了二分(为了二分而二分)。int l = 0, r = n - 1;while (l < r) { int mid = l + r >> 1; // 当下面出现 mid - 1 时,这里的 mid = l + r + 1 >> 1 if (check(mi原创 2022-04-17 10:49:37 · 1159 阅读 · 0 评论 -
最短单词距离系列(243 244 245)
243. 最短单词距离给定一个单词列表和两个单词 word1 和 word2,返回列表中这两个单词之间的最短距离。示例:假设 words = ["practice", "makes", "perfect", "coding", "makes"]输入: word1 = “coding”, word2 = “practice”输出: 3输入: word1 = "makes", word2 = "coding"输出: 1注意:你可以假设 word1 不等于 word2, 并且 word1 和原创 2022-01-10 10:26:35 · 339 阅读 · 0 评论 -
266. 回文排列
266. 回文排列给定一个字符串,判断该字符串中是否可以通过重新排列组合,形成一个回文字符串。示例 1:输入: "code"输出: false示例 2:输入: "aab"输出: true示例 3:输入: "carerac"输出: true解法:遍历重新排列后能组成回文串,必然满足一下两点之一对于偶数串而言,每个字符都重复,且都是偶数倍如:abba对于奇数串而言,除中间连着的相同字符是奇数个外,其他字符都重复,且都是偶数倍如:abbba 或 aba思想复杂原创 2022-01-10 08:31:45 · 909 阅读 · 0 评论 -
246. 中心对称数
246. 中心对称数中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看)。请写一个函数来判断该数字是否是中心对称数,其输入将会以一个字符串的形式来表达数字。示例 1:输入: num = "69"输出: true示例 2:输入: num = "88"输出: true示例 3:输入: num = "962"输出: false示例 4:输入:num = "1"输出:true解法:模拟思想0 <-> 01 <->原创 2022-01-09 20:02:31 · 944 阅读 · 0 评论 -
163. 缺失的区间
163. 缺失的区间给定一个排序的整数数组 nums ,其中元素的范围在 闭区间 [lower, upper] 当中,返回不包含在数组中的缺失区间。示例:输入: nums = [0, 1, 3, 50, 75], lower = 0 和 upper = 99,输出: ["2", "4->49", "51->74", "76->99"]解法:模拟思想没什么好说,按照题意就行复杂度时间复杂度:O(N)O(N)O(N)空间复杂度:O(1)O(1)O(1)代码class原创 2022-01-09 19:42:24 · 288 阅读 · 0 评论 -
1182. 与目标颜色间的最短距离
1182. 与目标颜色间的最短距离给你一个数组 colors,里面有 1、2、 3 三种颜色。我们需要在 colors 上进行一些查询操作 queries,其中每个待查项都由两个整数 i 和 c 组成。现在请你帮忙设计一个算法,查找从索引 i 到具有目标颜色 c 的元素之间的最短距离。如果不存在解决方案,请返回 -1。示例 1:输入:colors = [1,1,2,1,3,2,2,3,3], queries = [[1,3],[2,2],[6,1]]输出:[3,0,3]解释: 距离索引 1原创 2022-01-09 04:20:42 · 240 阅读 · 0 评论 -
1055. 形成字符串的最短路径
1055. 形成字符串的最短路径对于任何字符串,我们可以通过删除其中一些字符(也可能不删除)来构造该字符串的子序列。给定源字符串 source 和目标字符串 target,找出源字符串中能通过串联形成目标字符串的子序列的最小数量。如果无法通过串联源字符串中的子序列来构造目标字符串,则返回 -1。示例 1:输入:source = "abc", target = "abcbc"输出:2解释:目标字符串 "abcbc" 可以由 "abc" 和 "bc" 形成,它们都是源字符串 "abc" 的子序列。原创 2022-01-09 04:00:14 · 455 阅读 · 0 评论 -
562. 矩阵中最长的连续1线段
562. 矩阵中最长的连续1线段给定一个01矩阵 mat,找到矩阵中最长的连续1线段。这条线段可以是水平的、垂直的、对角线的或者反对角线的。示例:输入:[[0,1,1,0], [0,1,1,0], [0,0,0,1]]输出: 3提示: 给定矩阵中的元素数量不会超过 10,000。解法一:标准 DP思想状态表示f(0,i,j)f(0,i,j)f(0,i,j) 表示以 (i,j)(i,j)(i,j) 点为结尾的 水平 连续 1 线段的长度f(1,i,j)f(1,i,j)f(1,i,原创 2022-01-08 09:14:02 · 923 阅读 · 0 评论 -
1230. 抛掷硬币
1230. 抛掷硬币有一些不规则的硬币。在这些硬币中,prob[i] 表示第 i 枚硬币正面朝上的概率。请对每一枚硬币抛掷 一次,然后返回正面朝上的硬币数等于 target 的概率。示例 1:输入:prob = [0.4], target = 1输出:0.40000示例 2:输入:prob = [0.5,0.5,0.5,0.5,0.5], target = 0输出:0.03125解法一:经典 DP思想状态表示,f(i,j)f(i, j)f(i,j) 表示从第 111 个硬币到第 i原创 2022-01-07 19:06:35 · 525 阅读 · 0 评论 -
1746. 经过一次操作后的最大子数组和
1746. 经过一次操作后的最大子数组和你有一个整数数组 nums。你只能将一个元素 nums[i] 替换为 nums[i] * nums[i]。返回替换后的最大子数组和。示例 1:输入:nums = [2,-1,-4,-3]输出:17解释:你可以把-4替换为16(-4*(-4)),使nums = [2,-1,16,-3]. 现在,最大子数组和为 2 + -1 + 16 = 17.示例 2:输入:nums = [1,-1,1,1,-1,-1,1]输出:4解释:你可以把第一个-1替换为1原创 2022-01-07 17:32:57 · 1160 阅读 · 0 评论 -
487. 最大连续1的个数 II
487. 最大连续1的个数 II给定一个二进制数组,你可以最多将 1 个 0 翻转为 1,找出其中最大连续 1 的个数。示例 1:输入:[1,0,1,1,0]输出:4解释:翻转第一个 0 可以得到最长的连续 1。 当翻转以后,最大连续 1 的个数为 4。注:输入数组只包含 0 和 1.输入数组的长度为正整数,且不超过 10,000解法一:经典 DP思路状态表示,操作 即由 000 变 111f(i,0)f(i, 0)f(i,0) 表示包含第 iii 个位置,没有使用原创 2022-01-07 16:03:14 · 906 阅读 · 0 评论 -
265. 粉刷房子 II
265. 粉刷房子 II假如有一排房子,共 n 个,每个房子可以被粉刷成 m 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n*m 的矩阵来表示的。例如,costs[0][0] 表示第 0 号房子粉刷成 0 号颜色的成本花费;costs[1][2] 表示第 1 号房子粉刷成 2 号颜色的成本花费,以此类推。请你计算出粉刷完所有房子最少的花费成本。注意:原创 2022-01-07 13:42:28 · 524 阅读 · 0 评论 -
1259. 不相交的握手
1259. 不相交的握手难度困难21收藏分享切换为英文接收动态反馈偶数 个人站成一个圆,总人数为 n 。每个人与除自己外的一个人握手,所以总共会有 n / 2 次握手。将握手的人之间连线,请你返回连线不会相交的握手方案数。由于结果可能会很大,请你返回答案 模 10^9+7 后的结果示例输入:n = 6输出:5解法:DP思想状态表示:f(n)f(n)f(n) 表示 nnn 个人时的握手方案数当十个人时,如图所示,按照最后一个人的握手方式划分整个集合,将会划分成f(0)f(0)f原创 2022-01-07 09:44:42 · 324 阅读 · 0 评论 -
leetcode 并查集模版题
并查集模版附在文末。以下代码,省略模版,跑 leetcode 时记得补上。323. 无向图中连通分量的数目思想连通分量的数量就是并查集内的集合数量复杂度时间复杂度:O(N)O(N)O(N)空间复杂度:O(N)O(N)O(N)代码class Solution { public int countComponents(int n, int[][] edges) { UnionFind find = new UnionFind(n); for (int.原创 2022-01-06 06:57:28 · 187 阅读 · 0 评论 -
276. 栅栏涂色
276. 栅栏涂色有 k 种颜色的涂料和一个包含 n 个栅栏柱的栅栏,请你按下述规则为栅栏设计涂色方案:每个栅栏柱可以用其中 一种 颜色进行上色。相邻的栅栏柱 最多连续两个 颜色相同。给你两个整数 k 和 n ,返回所有有效的涂色 方案数 。输入:n = 3, k = 2输出:6解释:所有的可能涂色方案如上图所示。注意,全涂红或者全涂绿的方案属于无效方案,因为相邻的栅栏柱 最多连续两个 颜色相同。解法一:标准 DP思想状态表示f[i][0] 表示第 i 个与第 i -原创 2022-01-05 04:27:19 · 1832 阅读 · 0 评论 -
256. 粉刷房子
256. 粉刷房子假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的正整数矩阵 costs 来表示的。例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。示例 1:输入: costs =原创 2022-01-05 02:36:21 · 388 阅读 · 0 评论 -
277. 搜寻名人
277. 搜寻名人假设你是一个专业的狗仔,参加了一个 n 人派对,其中每个人被从 0 到 n - 1 标号。在这个派对人群当中可能存在一位 “名人”。所谓 “名人” 的定义是:其他所有 n - 1 个人都认识他/她,而他/她并不认识其他任何人。现在你想要确认这个 “名人” 是谁,或者确定这里没有 “名人”。而你唯一能做的就是问诸如 “A 你好呀,请问你认不认识 B呀?” 的问题,以确定 A 是否认识 B。你需要在(渐近意义上)尽可能少的问题内来确定这位 “名人” 是谁(或者确定这里没有 “名人”)。在原创 2022-01-04 00:28:35 · 433 阅读 · 0 评论 -
1167. 连接棒材的最低费用
1167. 连接棒材的最低费用为了装修新房,你需要加工一些长度为正整数的棒材 。棒材以数组 sticks 的形式给出,其中 sticks[i]是第 i 根棒材的长度。如果要将长度分别为 x 和 y 的两根棒材连接在一起,你需要支付 x + y 的费用。 由于施工需要,你必须将所有棒材连接成一根。返回你把所有棒材 sticks 连成一根所需要的最低费用。注意你可以任意选择棒材连接的顺序。示例 1:输入:sticks = [2,4,3]输出:14解释:从 sticks = [2,4,3] 开始。原创 2022-01-03 12:52:15 · 187 阅读 · 0 评论 -
624. 数组列表中的最大距离
624. 数组列表中的最大距离给定 m 个数组,每个数组都已经按照升序排好序了。现在你需要从两个不同的数组中选择两个整数(每个数组选一个)并且计算它们的距离。两个整数 a 和 b 之间的距离定义为它们差的绝对值 ∣a−b∣|a-b|∣a−b∣ 。你的任务就是去找到最大距离。示例 1:输入: [[1,2,3], [4,5], [1,2,3]]输出: 4解释:一种得到答案 4 的方法是从第一个数组或者第三个数组中选择 1,同时从第二个数组中选择 5 。解法一:暴力(TLE)思路很容易想原创 2022-01-03 11:42:03 · 2487 阅读 · 0 评论 -
280. 摆动排序
280. 摆动排序给你一个无序的数组 nums, 将该数字 原地 重排后使得 nums[0] <= nums[1] >= nums[2] <= nums[3]...。示例:输入: nums = [3,5,2,1,6,4]输出: 一个可能的解答是 [3,5,1,6,2,4]解法一:排序思路排序后,从第二元素开始每对交换[3,5,2,1,6,4] 排序 [1,2,3,4,5,6][1, 2,3, 4,5, 6] 第二个元素开始按对交换 [1, 3,2, 5,4, 6] 满足原创 2022-01-03 10:36:08 · 258 阅读 · 0 评论 -
716. 最大栈
716. 最大栈设计一个最大栈数据结构,既支持栈操作,又支持查找栈中最大元素。实现 MaxStack 类:MaxStack() 初始化栈对象void push(int x) 将元素 x 压入栈中。int pop() 移除栈顶元素并返回这个元素。int top() 返回栈顶元素,无需移除。int peekMax() 检索并返回栈中最大元素,无需移除。int popMax() 检索并返回栈中最大元素,并将其移除。如果有多个最大元素,只要移除 最靠近栈顶 的那个。示例:输入["MaxSt原创 2022-01-02 08:52:35 · 705 阅读 · 0 评论 -
1085. 最小元素各数位之和
1085. 最小元素各数位之和给你一个正整数的数组 A。然后计算 S,使其等于数组 A 当中最小的那个元素各个数位上数字之和。最后,假如 S 所得计算结果是 奇数 ,返回 0 ;否则请返回 1。示例 1:输入:[34,23,1,24,75,33,54,8]输出:0解释:最小元素为 1 ,该元素各个数位上的数字之和 S = 1 ,是奇数所以答案为 0 。思路找到整个数组的最小值(一次遍历即可)然后再把最小值的各个位累加一起。再判断奇偶数(位运算)二进制末尾 1 为偶数,0 为原创 2022-01-02 06:59:16 · 340 阅读 · 0 评论 -
1180. 统计只含单一字母的子串
1180. 统计只含单一字母的子串给你一个字符串 S,返回只含 单一字母 的子串个数。示例 1:输入: "aaaba"输出: 8解释: 只含单一字母的子串分别是 "aaa", "aa", "a", "b"。"aaa" 出现 1 次。"aa" 出现 2 次。"a" 出现 4 次。"b" 出现 1 次。所以答案是 1 + 2 + 4 + 1 = 8。解法:分组(双指针)思路将单个字母的最大字串分成多个组,每个组算 1 到 组长的累加和,再将所有组的累加和加在一起就是答案。1 到原创 2022-01-02 06:43:38 · 394 阅读 · 0 评论 -
1213. 三个有序数组的交集
1213. 三个有序数组的交集给出三个均为 严格递增排列 的整数数组 arr1,arr2 和 arr3。返回一个由 仅 在这三个数组中 同时出现 的整数所构成的有序数组。示例:输入: arr1 = [1,2,3,4,5], arr2 = [1,2,5,7,9], arr3 = [1,3,4,5,8]输出: [1,5]解释: 只有 1 和 5 同时在这三个数组中出现.解法:三指针思路三个指针指向的值相等时,找到一个元素,加入 res。不相等时,指向最小元素的指针往后移动一个。复杂度时原创 2022-01-02 05:53:59 · 187 阅读 · 0 评论 -
760. 找出变位映射
760. 找出变位映射给定两个列表 A and B,并且 B 是 A 的变位(即 B 是由 A 中的元素随机排列后组成的新列表)。我们希望找出一个从 A 到 B 的索引映射 P 。一个映射P[i] = j 指的是列表 A 中的第 i 个元素出现于列表 B 中的第 j 个元素上。列表 A 和 B 可能出现重复元素。如果有多于一种答案,输出任意一种。例如,给定A = [12, 28, 46, 32, 50]B = [50, 12, 32, 46, 28]需要返回[1, 4, 3, 2, 0]原创 2022-01-02 05:39:14 · 199 阅读 · 0 评论 -
1165. 单行键盘
1165. 单行键盘我们定制了一款特殊的力扣键盘,所有的键都排列在一行上。我们可以按从左到右的顺序,用一个长度为 26 的字符串 keyboard (索引从 0 开始,到 25 结束)来表示该键盘的键位布局。现在需要测试这个键盘是否能够有效工作,那么我们就需要个机械手来测试这个键盘。最初的时候,机械手位于左边起第一个键(也就是索引为 0 的键)的上方。当机械手移动到某一字符所在的键位时,就会在终端上输出该字符。机械手从索引 i 移动到索引 j 所需要的时间是 |i - j|。当前测试需要你使用机原创 2022-01-02 05:38:44 · 244 阅读 · 0 评论 -
1119. 删去字符串中的元音
1119. 删去字符串中的元音给你一个字符串 S,请你删去其中的所有元音字母( ‘a’,‘e’,‘i’,‘o’,‘u’),并返回这个新字符串。示例 1:输入:"leetcodeisacommunityforcoders"输出:"ltcdscmmntyfrcdrs"解法一:模拟class Solution { public String removeVowels(String s) { StringBuilder sb = new StringBuilder();原创 2022-01-02 05:38:09 · 457 阅读 · 0 评论 -
1265. 逆序打印不可变链表
1265. 逆序打印不可变链表给您一个不可变的链表,使用下列接口逆序打印每个节点的值:ImmutableListNode: 描述不可变链表的接口,链表的头节点已给出。您需要使用以下函数来访问此链表(您 不能 直接访问 ImmutableListNode):ImmutableListNode.printValue():打印当前节点的值。ImmutableListNode.getNext():返回下一个节点。输入只用来内部初始化链表。您不可以通过修改链表解决问题。也就是说,您只能通过上述 A原创 2022-01-02 04:09:44 · 336 阅读 · 0 评论 -
161. 相隔为 1 的编辑距离
161. 相隔为 1 的编辑距离给定两个字符串 s 和 t,判断他们的编辑距离是否为 1。注意:满足编辑距离等于 1 有三种可能的情形往 s 中插入一个字符得到 t从 s 中删除一个字符得到 t在 s 中替换一个字符得到 t示例 1:输入: s = "ab", t = "acb"输出: true解释: 可以将 'c' 插入字符串 s 来得到 t。示例 2:输入: s = "1203", t = "1213"输出: true解释: 可以将字符串 s 中的 '0' 替换为 '1'原创 2022-01-01 13:42:36 · 852 阅读 · 0 评论 -
leetcode 会议室系列
253. 会议室 II给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,为避免会议冲突,同时要考虑充分利用会议室资源,请你计算至少需要多少间会议室,才能满足这些会议安排。示例 1:输入:intervals = [[0,30],[5,10],[15,20]]输出:2示例 2:输入:intervals = [[7,10],[2,4]]输出:1思路贪心策略。开会的时候先看看有没有结束的会议,如原创 2022-01-01 11:42:32 · 1513 阅读 · 0 评论 -
156. 上下翻转二叉树
156. 上下翻转二叉树给你一个二叉树的根节点 root ,请你将此二叉树上下翻转,并返回新的根节点。你可以按下面的步骤翻转一棵二叉树:原来的左子节点变成新的根节点原来的根节点变成新的右子节点原来的右子节点变成新的左子节点上面的步骤逐层进行。题目数据保证每个右节点都有一个同级节点(即共享同一父节点的左节点)且不存在子节点。示例 1:输入:root = [1,2,3,4,5]输出:[4,5,2,null,null,3,1]思路就是模拟,画图过流程就可以了复杂度时间复杂度:原创 2022-01-01 10:35:25 · 843 阅读 · 0 评论 -
leetcode 树
树遍历二叉树的前序遍历递归vector<int> res;vector<int> preorderTraversal(TreeNode* root) { dfs(root); return res;}void dfs(TreeNode* root) { if(!root) return; res.push_back(root->val); dfs(root->left); dfs(root-&g原创 2021-05-29 20:53:45 · 350 阅读 · 0 评论 -
leetcode 数组
数组有效数独按行枚举,按列枚举,按方格枚举bool isValidSudoku(vector<vector<char>>& g) { bool st[9]; // 行枚举 for (int i = 0; i < 9; i++) { memset(st, 0, sizeof(st)); for (int j = 0; j < 9; j++) { if (g[i][j] != '.') { int t = g[i][j] - '1'原创 2021-05-26 03:06:52 · 291 阅读 · 0 评论