- 博客(199)
- 收藏
- 关注
原创 992. K 个不同整数的子数组
题目描述:给定一个正整数数组 A,如果 A 的某个子数组中不同整数的个数恰好为 K,则称 A 的这个连续、不一定独立的子数组为好子数组。(例如,[1,2,3,1,2] 中有 3 个不同的整数:1,2,以及 3。)返回 A 中好子数组的数目。解题思路:遍历每一个位置作为固定的右边界,找到满足好子数组条件的左边界的区间范围,整个区间的长度就是以当前位置为右边界符合条件的好子数组的数量,代码如下:class Solution: def subarraysWithKDistinct(self, A:
2021-02-09 12:31:39
281
原创 480. 滑动窗口中位数
题目描述:中位数是有序序列最中间的那个数。如果序列的长度是偶数,则没有最中间的数;此时中位数是最中间的两个数的平均数。例如:[2,3,4],中位数是 3[2,3],中位数是 (2 + 3) / 2 = 2.5给你一个数组 nums,有一个长度为 k 的窗口从最左端滑动到最右端。窗口中有 k 个数,每次窗口向右移动 1 位。你的任务是找出每次窗口移动后得到的新窗口中元素的中位数,并输出由它们组成的数组。解题思路:用两个优先级队列small和large来存储滑动窗口内的数据,small是一个大顶推存储
2021-02-03 22:43:09
261
原创 888. 公平的糖果棒交换
题目描述:爱丽丝和鲍勃有不同大小的糖果棒:A[i] 是爱丽丝拥有的第 i 根糖果棒的大小,B[j] 是鲍勃拥有的第 j 根糖果棒的大小。因为他们是朋友,所以他们想交换一根糖果棒,这样交换后,他们都有相同的糖果总量。(一个人拥有的糖果总量是他们拥有的糖果棒大小的总和。)返回一个整数数组 ans,其中 ans[0] 是爱丽丝必须交换的糖果棒的大小,ans[1] 是 Bob 必须交换的糖果棒的大小。如果有多个答案,你可以返回其中任何一个。保证答案存在。解题思路:因为一定有可行解,那么我们可以知道可行解之差
2021-02-01 11:45:37
263
原创 839. 相似字符串组
题目描述:如果交换字符串 X 中的两个不同位置的字母,使得它和字符串 Y 相等,那么称 X 和 Y 两个字符串相似。如果这两个字符串本身是相等的,那它们也是相似的。例如,“tars” 和 “rats” 是相似的 (交换 0 与 2 的位置); “rats” 和 “arts” 也是相似的,但是 “star” 不与 “tars”,“rats”,或 “arts” 相似。总之,它们通过相似性形成了两个关联组:{“tars”, “rats”, “arts”} 和 {“star”}。注意,“tars” 和 “art
2021-01-31 14:13:34
194
原创 1631. 最小体力消耗路径
题目描述:你准备参加一场远足活动。给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row, col) 的高度。一开始你在最左上角的格子 (0, 0) ,且你希望去最右下角的格子 (rows-1, columns-1) (注意下标从 0 开始编号)。你每次可以往 上,下,左,右 四个方向之一移动,你想要找到耗费 体力 最小的一条路径。一条路径耗费的 体力值 是路径上相邻格子之间 高度差绝对值 的 最大值 决定的。请你返回从左上角走
2021-01-29 22:58:45
122
原创 1579. 保证图可完全遍历
题目描述:Alice 和 Bob 共有一个无向图,其中包含 n 个节点和 3 种类型的边:类型 1:只能由 Alice 遍历。类型 2:只能由 Bob 遍历。类型 3:Alice 和 Bob 都可以遍历。给你一个数组 edges ,其中 edges[i] = [typei, ui, vi] 表示节点 ui 和 vi 之间存在类型为 typei 的双向边。请你在保证图仍能够被 Alice和 Bob 完全遍历的前提下,找出可以删除的最大边数。如果从任何节点开始,Alice 和 Bob 都可以到达所有其
2021-01-27 16:48:14
91
1
原创 1128. 等价多米诺骨牌对的数量
题目描述:给你一个由一些多米诺骨牌组成的列表 dominoes。如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的。形式上,dominoes[i] = [a, b] 和 dominoes[j] = [c, d] 等价的前提是 ac 且 bd,或是 ad 且 bc。在 0 <= i < j < dominoes.length 的前提下,找出满足 dominoes[i] 和 dominoes[j] 等价的骨牌对 (i, j) 的数量
2021-01-26 21:33:30
85
原创 959. 由斜杠划分区域
题目描述:在由 1 x 1 方格组成的 N x N 网格 grid 中,每个 1 x 1 方块由 /、\ 或空格构成。这些字符会将方块划分为一些共边的区域。(请注意,反斜杠字符是转义的,因此 \ 用 “\” 表示。)。返回区域的数目。解题思路:每个一个网格分成上下左右四个三角形,如果是左斜杠就连接0、3和1、2三角形,如果是反斜杠,就连接0、1和2、3三角形,如果是空格就连接四个三角形,另外还要连接网格之间的三角形,进行左右和上下的连接,代码如下:class UnionFind():
2021-01-25 12:31:09
97
原创 1319. 连通网络的操作次数
题目描述:用以太网线缆将 n 台计算机连接成一个网络,计算机的编号从 0 到 n-1。线缆用 connections 表示,其中 connections[i] = [a, b] 连接了计算机 a 和 b。网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。给你这个计算机网络的初始布线 connections,你可以拔开任意两台直连计算机之间的线缆,并用它连接一对未直连的计算机。请你计算并返回使所有计算机都连通所需的最少操作次数。如果不可能,则返回 -1 。解题思路:通过
2021-01-23 16:10:14
90
原创 1489. 找到最小生成树里的关键边和伪关键边
题目描述:给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] = [fromi, toi, weighti] 表示在 fromi 和 toi 节点之间有一条带权无向边。最小生成树 (MST) 是给定图中边的一个子集,它连接了所有节点且没有环,而且这些边的权值和最小。请你找到给定图中最小生成树的所有关键边和伪关键边。如果从图中删去某条边,会导致最小生成树的权值和增加,那么我们就说它是一条关键边。伪关键边则是可能会出现在某些最小生成树中但不
2021-01-23 15:55:09
128
3
原创 1584. 连接所有点的最小费用
题目描述:给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单路径时,才认为所有点都已连接解法一:每次都加入和已构成联通区域中的点的最短距离对应的连接的那个点class Solution: def m
2021-01-19 22:45:46
153
原创 721. 账户合并
题目描述:给定一个列表 accounts,每个元素 accounts[i] 是一个字符串列表,其中第一个元素 accounts[i][0] 是 名称 (name),其余元素是 emails 表示该账户的邮箱地址。现在,我们想合并这些账户。如果两个账户都有一些共同的邮箱地址,则两个账户必定属于同一个人。请注意,即使两个账户具有相同的名称,它们也可能属于不同的人,因为人们可能具有相同的名称。一个人最初可以拥有任意数量的账户,但其所有账户都具有相同的名称。合并账户后,按以下格式返回账户:每个账户的第一个元素是
2021-01-18 12:00:17
131
1
原创 803. 打砖块
题目描述:有一个 m x n 的二元网格,其中 1 表示砖块,0 表示空白。砖块 稳定(不会掉落)的前提是:一块砖直接连接到网格的顶部,或者至少有一块相邻(4 个方向之一)砖块 稳定 不会掉落时给你一个数组 hits ,这是需要依次消除砖块的位置。每当消除 hits[i] = (rowi, coli) 位置上的砖块时,对应位置的砖块(若存在)会消失,然后其他的砖块可能因为这一消除操作而掉落。一旦砖块掉落,它会立即从网格中消失(即,它不会落在其他稳定的砖块上)。返回一个数组 result ,其中 re
2021-01-16 17:15:19
86
原创 947. 移除最多的同行或同列石头
题目描述:n 块石头放置在二维平面中的一些整数坐标点上。每个坐标点上最多只能有一块石头。如果一块石头的 同行或者同列 上有其他石头存在,那么就可以移除这块石头。给你一个长度为 n 的数组 stones ,其中 stones[i] = [xi, yi] 表示第 i 块石头的位置,返回 可以移除的石子 的最大数量。解题思路:其实这道题的本质是对一个有向图,求连通分量的数量,因为对每一个联通分量我们都可以按照dfs遍历逆序的顺序移除石子,让这个连通分量只剩下一个石子,求联通分量我们可以用并查集来求,因为这里
2021-01-15 14:56:03
122
原创 172. 阶乘后的零
class Solution: def trailingZeroes(self, n: int) -> int: accm = 1 ans = 0 for i in range(2, n+1): accm *= i while(accm % 10 == 0): ans += 1 accm //= 10 return an
2021-01-14 11:13:02
104
原创 684. 冗余连接
题目描述:在本问题中, 树指的是一个连通且无环的无向图。输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u <
2021-01-13 14:24:30
106
原创 1203. 项目管理
题目描述:公司共有 n 个项目和 m 个小组,每个项目要不无人接手,要不就由 m 个小组之一负责。group[i] 表示第 i 个项目所属的小组,如果这个项目目前无人接手,那么 group[i] 就等于 -1。(项目和小组都是从零开始编号的)小组可能存在没有接手任何项目的情况。请你帮忙按要求安排这些项目的进度,并返回排序后的项目列表:同一小组的项目,排序后在列表中彼此相邻。项目之间存在一定的依赖关系,我们用一个列表 beforeItems 来表示,其中 beforeItems[i] 表示在进行第
2021-01-12 17:01:51
102
原创 1202. 交换字符串中的元素
题目描述:给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。你可以 任意多次交换 在 pairs 中任意一对索引处的字符。返回在经过若干次交换后,s 可以变成的按字典序最小的字符串。解题思路:因为交换具有传递性,这其实是一个图论问题,找到所有可以互相连通的连通域集合,在每个连通域内进行升序排序即可class Solution: def smallestStringWithSwaps(sel
2021-01-11 12:38:22
162
1
原创 123. 买卖股票的最佳时机 III
题目描述:给定一个数组,它的第 i 个元素是一支给定的股票在第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。解题思路:动态规划,每天交易结束时可能有两种情况,一是手上有股票二是手上无股票,然后在这个基础上加上交易次数,当前次数的交易次数只和当前和上一次交易次数有关,然后进行关系转移,代码如下:class Solution: def maxProfit(self, prices: List
2021-01-09 17:40:07
73
原创 189. 旋转数组
题目描述:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。解题思路一:先用一个临时数组存储最终结果,然后再一个一个赋值class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ n = len(nums)
2021-01-08 14:48:53
51
原创 204. 计数质数
题目描述:统计所有小于非负整数 n 的质数的数量。解题思路一:线性筛class Solution: def countPrimes(self, n: int) -> int: prime = [] isprime = [True] * n for i in range(2, n): if isprime[i]: prime.append(i) j = 0
2021-01-08 12:00:32
61
原创 547. 省份数量
题目描述:有 n 个城市,其中一些彼此相连,另一些没有相连。如果城市 a 与城市 b 直接相连,且城市 b 与城市 c 直接相连,那么城市 a 与城市 c 间接相连。省份 是一组直接或间接相连的城市,组内不含其他没有相连的城市。给你一个 n x n 的矩阵 isConnected ,其中 isConnected[i][j] = 1 表示第 i 个城市和第 j 个城市直接相连,而 isConnected[i][j] = 0 表示二者不直接相连。返回矩阵中 省份 的数量。解题思路一:DFSclass
2021-01-07 10:27:57
116
原创 399. 除法求值
题目描述:给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每个 Ai 或 Bi 是一个表示单个变量的字符串。另有一些以数组 queries 表示的问题,其中 queries[j] = [Cj, Dj] 表示第 j 个问题,请你根据已知条件找出 Cj / Dj = ? 的结果作为答案。返回 所有问题的答案 。如果存在某个无法确定的答案,
2021-01-06 22:53:51
69
1
原创 932. 漂亮数组
题目描述:对于某些固定的 N,如果数组 A 是整数 1, 2, …, N 组成的排列,使得:对于每个 i < j,都不存在 k 满足 i < k < j 使得 A[k] * 2 = A[i] + A[j]。那么数组 A 是漂亮数组。给定 N,返回任意漂亮数组 A(保证存在一个)。解题思路:(1)漂亮数组进行放射变换之后还是漂亮数组(2)如果左边的漂亮数组都是奇数,右边的漂亮数组都是偶数,那么左边加上右边也是漂亮数组,因为奇数+偶数一定是奇数方案一:动态规划class Solut
2021-01-05 13:00:08
209
原创 605. 种花问题
题目描述:假设你有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花卉不能种植在相邻的地块上,它们会争夺水源,两者都会死去。给定一个花坛(表示为一个数组包含0和1,其中0表示没种植花,1表示种植了花),和一个数 n 。能否在不打破种植规则的情况下种入 n 朵花?能则返回True,不能则返回False。解题思路一:动态规划,首先计算原有花团中的花,然后dp[i][0]表示当前位置i不种花到i位置可种花的最大值,dp[i][1]表示当前位置i种花到位置i为止可以种花的最大数目,代码如下:clas
2021-01-01 21:58:23
89
原创 435. 无重叠区间
题目描述:给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。解题思路:按照区间的左边界对集合进行排序,然后依次将每个区间压入栈中,如果当前区间的左边界小于栈顶区间的有边界,即发生了重合,需要移除区间,这个时候我们贪心的移除掉右边界更大的区间,因为这样和后面区间重合的可能性更小,代码如下:class Solution: def eraseOverlapInterv
2020-12-31 11:38:04
122
原创 1046. 最后一块石头的重量
题目描述:有一堆石头,每块石头的重量都是正整数。每一回合,从中选出两块 最重的 石头,然后将它们一起粉碎。假设石头的重量分别为 x 和 y,且 x <= y。那么粉碎的可能结果如下:如果 x == y,那么两块石头都会被完全粉碎;如果 x != y,那么重量为 x 的石头将会完全粉碎,而重量为 y 的石头新重量为 y-x。最后,最多只会剩下一块石头。返回此石头的重量。如果没有石头剩下,就返回 0。解题思路:用大顶推存储所有的石头,每次取出最大的两块做碰撞,如果有剩余的则将差值加入队列中,直到
2020-12-31 11:24:24
88
原创 241. 为运算表达式设计优先级
题目描述:给定一个含有数字和运算符的字符串,为表达式添加括号,改变其运算优先级以求出不同的结果。你需要给出所有可能的组合的结果。有效的运算符号包含 +, - 以及 * 。解题思路一:对于每一个运算符号,先执行两边的表达式,然后再处理当前这个符号,采用分治的思想,代码如下:class Solution: def diffWaysToCompute(self, input: str) -> List[int]: # res = set() nums = []
2020-12-29 16:27:54
105
原创 330. 按要求补齐数组
题目描述:给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。解题思路:如果区间[1,x-1]的区间都被覆盖,如果数组中有x,那么区间[1,2x-1]也会被覆盖,如果不存在就补充x,代码如下:class Solution: def minPatches(self, nums: List[int], n: in
2020-12-29 13:49:51
62
原创 310. 最小高度树
题目描述:树是一个无向图,其中任何两个顶点只通过一条路径连接。 换句话说,一个任何没有简单环路的连通图都是一棵树。给你一棵包含 n 个节点的数,标记为 0 到 n - 1 。给定数字 n 和一个有 n - 1 条无向边的 edges 列表(每一个边都是一对标签),其中 edges[i] = [ai, bi] 表示树中节点 ai 和 bi 之间存在一条无向边。可选择树中任何一个节点作为根。当选择节点 x 作为根节点时,设结果树的高度为 h 。在所有可能的树中,具有最小高度的树(即,min(h))被称为
2020-12-28 22:15:59
115
原创 37. 解数独
题目描述:编写一个程序,通过填充空格来解决数独问题。一个数独的解法需遵循如下规则:数字 1-9 在每一行只能出现一次。数字 1-9 在每一列只能出现一次。数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。空白格用 ‘.’ 表示。解题思路:思路和N皇后问题是一样的,只是在找到正确答案之后就要停止递归和回溯,此外每个3*3的block的访问下标需要正确计算,代码如下:class Solution: def solveSudoku(self, board: List[List[
2020-12-28 20:08:45
62
原创 40. 组合总和 II
题目描述:给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用一次。说明:所有数字(包括目标数)都是正整数。解集不能包含重复的组合。解题思路:依然是回溯,需要考虑重复元素,而且组合问题的话,就是一旦考虑了,之后就不需要考虑,所以不像排列那样需要交换,直接考虑剩下的元素就可以了,代码如下:class Solution: def combinationS
2020-12-28 15:32:47
60
原创 47. 全排列 II
题目描述:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。解题思路:和全排列一样的用dfs+回溯,只是因为可能有重复的元素,因此在进行选择是否进行当前次迭代,通过看当前值是否已经在前面遍历中出现过了,不能直接和上一个比较,因为在进行交换之后数组已经无序了,代码如下:class Solution: def permuteUnique(self, nums: List[int]) -> List[List[int]]: # nums.sort()
2020-12-26 12:07:14
66
原创 2020-12-24
题目描述:给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。解题思路:dfs+回溯# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def binary
2020-12-24 11:49:17
93
原创 130. 被围绕的区域
题目描述:给定一个二维的矩阵,包含 ‘X’ 和 ‘O’(字母 O)。找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。被围绕的区间不会存在于边界上,换句话说,任何边界上的 ‘O’ 都不会被填充为 ‘X’。 任何不在边界上,或不与边界上的 ‘O’ 相连的 ‘O’ 最终都会被填充为 ‘X’。如果两个元素在水平或垂直方向相邻,则称它们是“相连”的。解题思路:根据解释得到了思路,可以先从矩阵的四条边用dfs遍历可以到达的"O",这些"O"都是没法被"X"包围的,将他们打上标记,然
2020-12-23 22:06:50
67
原创 2020-12-23
题目描述:给定两个单词(beginWord 和 endWord)和一个字典 wordList,找出所有从 beginWord 到 endWord 的最短转换序列。转换需遵循如下规则:每次转换只能改变一个字母。转换后得到的单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回一个空列表。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。解题思路一:先利用字典里的单词以及开始和结尾单词构建
2020-12-23 20:43:16
70
原创 2020-12-23
题目描述:在给定的二维二进制数组 A 中,存在两座岛。(岛是由四面相连的 1 形成的一个最大组。)现在,我们可以将 0 变为 1,以使两座岛连接起来,变成一座岛。返回必须翻转的 0 的最小数目。(可以保证答案至少是 1。)解题思路:先用dfs找到一个岛屿以及离它最近的一圈为0的边缘点,将他们的值改为2,表示已经访问过了,然后将边缘点都添加到队列中,再依次遍历队列中的所有点,利用bfs,一层一层遍历找到离另一个岛屿最近的一条路径,遇到1就可以直接返回结果,遇到2直接跳过,遇到0依旧将点添加到队列中,代码
2020-12-23 16:54:07
115
原创 2020-12-23
题目描述:n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给定一个整数 n,返回所有不同的 n 皇后问题的解决方案。每一种解法包含一个明确的 n 皇后问题的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。解题思路:和矩阵中找字符串的思路是一样的,同样是回溯法加修改访问状态,这是这里的访问状态需要考虑行、列以及左右对角线,因为是n*n的棋盘,然后放的是n个皇后,所以每一行每一列都只能有一个皇后,因此我们用遍历行的方式,这样就不用记录行的访
2020-12-23 11:45:54
57
原创 2020-12-23
题目描述:给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。解题思路:同样也是回溯,只不过这里回溯的方法是采样修改访问标记的方法,而不是修改输出的方法,代码如下:class Solution: def exist(self, board: List[List[str]], word: str) -> bool: n, m =
2020-12-23 11:07:53
62
原创 77. 组合
题目描述:给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。解题思路:也是利用回溯的方法,只是组合这里回溯的是是否把当前元素加入结果中,代码如下:class Solution: def combine(self, n: int, k: int) -> List[List[int]]: comb = [0] * k res = [] def traceback(i, index): if inde
2020-12-23 10:22:39
64
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人