自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(238)
  • 收藏
  • 关注

原创 LeetCode 767 重构字符串

给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。示例1:输入: S = "aab"输出: "aba"示例 2:输入: S = "aaab"输出: ""本题采用贪心算法和堆来求解。我们尽可能向构造的字符串中加入剩余数量多的字符,这样避免剩余过多的单一字符,最后相邻。每次选出剩余最多的两个字符就可以避免和以构造的字符串末尾同。import heapqfrom collections impo.

2020-11-30 18:59:43 4

原创 LeetCode 493 翻转对

给定一个数组nums,如果i < j且nums[i] > 2*nums[j]我们就将(i, j)称作一个重要翻转对。你需要返回给定数组中的重要翻转对的数量。首先给出二分搜索算法的解法:class Solution: def reversePairs(self, nums: List[int]) -> int: arr = [] res = 0 for val in nums[::-1]: ...

2020-11-28 15:10:55 4

原创 LeetCode 18 四数之和

给定一个包含n 个整数的数组nums和一个目标值target,判断nums中是否存在四个元素 a,b,c和 d,使得a + b + c + d的值与target相等?找出所有满足条件且不重复的四元组。结果不可重复注意要去重from typing import *class Solution: def fourSum(self, nums: List[int], target: int) -> List[List[int]]: res ...

2020-11-27 09:11:10 9

原创 LeetCode 454 四数相加

给定四个包含整数的数组列表A , B , C , D ,计算有多少个元组 (i, j, k, l),使得A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过231 - 1 。本题如果暴力解决,那么时间复杂度为O(n^4)。如果将按个数组元素的和保存在哈希表中,那么时间复杂度为O(n^3)。我们将两个数组元素的和...

2020-11-27 08:58:37 14

原创 LeetCode 164 最大间距

给定一个无序的数组,找出数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。from typing import *class Solution: def maximumGap(self, nums: List[int]) -> int: if len(nums) < 2: return 0 max_val, min_val = max(nums), min(nums) if

2020-11-26 09:56:18 1

原创 LeetCode 951 翻转等价二叉树

我们可以为二叉树 T 定义一个翻转操作,如下所示:选择任意节点,然后交换它的左子树和右子树。只要经过一定次数的翻转操作后,能使 X 等于 Y,我们就称二叉树 X 翻转等价于二叉树 Y。编写一个判断两个二叉树是否是翻转等价的函数。这些树由根节点root1 和 root2给出。class Solution: def flipEquiv(self, root1: TreeNode, root2: TreeNode) -> bool: return self.jud..

2020-11-24 11:03:31 11

原创 LeetCode 222 完全二叉树的节点个数

给出一个完全二叉树,求出该树的节点个数。说明:完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~2h个节点。# Definition for a binary tree node.class TreeNode: def __init__(self, x): self.val = x self.left = None ..

2020-11-24 10:54:38 11

原创 LeetCode 242 有效的字母异位词

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例1:输入: s = "anagram", t = "nagaram"输出: true示例 2:输入: s = "rat", t = "car"输出: false说明:你可以假设字符串只包含小写字母。class Solution: def isAnagram(self, s: str, t: str) -> bool: arr1, arr2 = [0] * 26, [.

2020-11-22 09:16:15 7

原创 LeetCode 260 只出现一次的数字3

给定一个整数数组nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。示例 :输入: [1,2,1,3,2,5]输出: [3,5]lowbit操作在树状数组中也见过,保留最右边的1,剩余全部变为0。存在两个数不同,最终异或结果肯定不为0,from typing import *class Solution: def singleNumber(self, nums: List[int]) -> List[int]: ..

2020-11-18 14:27:57 6

原创 LeetCode 201 数字范围按位与

给定范围 [m, n],其中 0 <= m <= n <= 2147483647,返回此范围内所有数字的按位与(包含 m, n 两端点)。示例 1:输入: [5,7]输出: 4示例 2:输入: [0,1]输出: 0本题关键在于找到两个数字的二进制公共前缀,然后后面的补0。class Solution: def rangeBitwiseAnd(self, m: int, n: int) -> int: shift = 0 .

2020-11-17 20:51:19 9

原创 LeetCode 1030 距离顺序排列矩阵单元格

给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。另外,我们在该矩阵中给出了一个坐标为(r0, c0) 的单元格。返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)from typing import .

2020-11-17 08:57:43 10

原创 LeetCode 406 根据身高重建队列

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。注意:总人数少于1100人。示例输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]由于是看前面有几个升高更高的,所以我们需要按照身高由高到低排序。然后再项结果队列中一个一个插入元素。

2020-11-16 19:47:38 11

原创 LeetCode 307 区域和检索

给定一个整数数组 nums,求出数组从索引i到j(i≤j) 范围内元素的总和,包含i,j两点。update(i, val) 函数可以通过将下标为i的数值更新为val,从而对数列进行修改。利用树状数组实现。from typing import *class NumArray: def __init__(self, nums: List[int]): self.n = len(nums) self.c = [0] * (...

2020-11-14 08:36:29 8

原创 LeetCode 22 括号生成

数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且有效的括号组合。利用卡特兰数的构造方法进行构造。from typing import *class Solution: """ 利用卡特兰数的构造方法进行构造 """ def __init__(self): self.dic1 = {0: [''], 1: ['()']} def generateParenthesi...

2020-11-13 11:58:45 8

原创 LeetCode 556 下一个更大元素

给定一个32位正整数n,你需要找到最小的32位整数,其与n中存在的位数完全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。本题可以直接套用下一个更大排列。from typing import *class Solution: def nextGreaterElement(self, n: int) -> int: nums = [] n1 = n while n: nums.append...

2020-11-11 10:18:53 10

原创 2020-11-11

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1from typing import *class Solution: def nextPermutation(self, nums: List[i

2020-11-11 09:11:06 21

原创 LeetCode 122 买卖股票的最佳时机2

给定一个数组,它的第i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。道理很简单,如果当天股价高于前一天,那么就加上这两天的差值。from typing import *class Solution: def maxProfit(self, prices: List[int]) -> int: tem_p.

2020-11-08 10:10:31 48

原创 LeetCode 327 区间和的个数

给定一个整数数组nums,返回区间和在[lower, upper]之间的个数,包含lower和upper。区间和S(i, j)表示在nums中,位置从i到j的元素之和,包含i和j(i ≤ j)。肯定是想要得到一个NlogN的方法。这道题可以采用归并,线段树,树状数组等方法,这里给出二分搜索题解。from typing import *import bisectclass Solution: def countRangeSum(self, n...

2020-11-07 11:16:30 23

原创 LeetCode 1356 根据数组二进制下1的数目排序

利用位运算解决问题class Solution: def sortByBits(self, arr: List[int]) -> List[int]: dic1 = {} for val in arr: dic1[val] = self.num_one(val) arr.sort(key=lambda x: (dic1[x], x)) return arr def num_one(self,

2020-11-06 09:41:22 13

原创 LeetCode 57 插入区间

给出一个无重叠的 ,按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。本题可以有线性复杂度的算法,但是线性复杂度的算法需要考虑的情况很多,不如之间先排序后合并。from typing import *class Solution: def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[i

2020-11-04 08:51:35 39

原创 LeetCode LCP 04 覆盖

你有一块棋盘,棋盘上有一些格子已经坏掉了。你还有无穷块大小为1 * 2的多米诺骨牌,你想把这些骨牌不重叠地覆盖在完好的格子上,请找出你最多能在棋盘上放多少块骨牌?这些骨牌可以横着或者竖着放。输入:n, m代表棋盘的大小;broken是一个b * 2的二维数组,其中每个元素代表棋盘上每一个坏掉的格子的位置。输出:一个整数,代表最多能在棋盘上放的骨牌数。from typing import *class Solution: def __init__(self): .

2020-11-03 15:17:18 55

原创 LeetCode 797 所有可能的路径

给一个有n个结点的有向无环图,找到所有从0到n-1的路径并输出(不要求按顺序)二维数组的第 i 个数组中的单元都表示有向图中 i 号结点所能到达的下一些结点(译者注:有向图是有方向的,即规定了 a→b 你就不能从 b→a )空就是没有下一个结点了。from typing import *class Solution: def __init__(self): self.res = [] self.visited = None ...

2020-11-03 11:53:14 37

原创 LeetCode 1627 带阈值的图连通性

有 n 座城市,编号从 1 到 n 。编号为 x 和 y 的两座城市直接连通的前提是: x 和 y 的公因数中,至少有一个 严格大于 某个阈值 threshold 。更正式地说,如果存在整数 z ,且满足以下所有条件,则编号 x 和 y 的城市之间有一条道路:x % z == 0y % z == 0z > threshold给你两个整数 n 和 threshold ,以及一个待查询数组,请你判断每个查询 queries[i] = [ai, bi] 指向的城市 ai 和 bi 是否连通(即,它

2020-11-03 11:51:11 16

原创 LeetCode 381 O(1)时间内插入,删除和获取元素

设计一个支持在平均时间复杂度O(1)下,执行以下操作的数据结构。注意: 允许出现重复元素。insert(val):向集合中插入元素 val。remove(val):当 val 存在时,从集合中移除一个 val。getRandom:从现有集合中随机获取一个元素。每个元素被返回的概率应该与其在集合中的数量呈线性相关。from collections import defaultdictimport randomclass RandomizedCollection: d...

2020-10-31 09:22:18 278

原创 LeetCode 1092 最短公共超序列

给出两个字符串str1 和str2,返回同时以str1和str2作为子序列的最短字符串。如果答案不止一个,则可以返回满足条件的任意一个答案。(如果从字符串 T 中删除一些字符(也可能不删除,并且选出的这些字符可以位于 T 中的任意位置),可以得到字符串 S,那么S 就是T 的子序列)from typing import *from collections import defaultdictclass Solution: def shortestCommonSup...

2020-10-27 09:02:25 51

原创 LeetCode 1267 统计参与通信的服务器

这里有一幅服务器分布图,服务器的位置标识在m * n的整数矩阵网格grid中,1 表示单元格上有服务器,0 表示没有。如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。请你统计并返回能够与至少一台其他服务器进行通信的服务器的数量。from typing import *class Solution: def countServers(self, grid: List[List[int]]) -> int: r = len(grid)...

2020-10-26 20:59:58 22

原创 LeetCode 1627 带阈值的图连通性

有 n 座城市,编号从 1 到 n 。编号为 x 和 y 的两座城市直接连通的前提是: x 和 y 的公因数中,至少有一个 严格大于 某个阈值 threshold 。更正式地说,如果存在整数 z ,且满足以下所有条件,则编号 x 和 y 的城市之间有一条道路:x % z == 0y % z == 0z > threshold给你两个整数 n 和 threshold ,以及一个待查询数组,请你判断每个查询 queries[i] = [ai, bi] 指向的城市 ai 和 bi 是否连通(即,它

2020-10-21 14:56:55 17

原创 LeetCode 925 长按键入

你的朋友正在使用键盘输入他的名字name。偶尔,在键入字符c时,按键可能会被长按,而字符可能被输入 1 次或多次。你将会检查键盘输入的字符typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回True。我的解法:class Solution: def isLongPressedName(self, name: str, typed: str) -> bool: list1 = self.helper(name) ...

2020-10-21 07:31:17 15

原创 LeetCode 143 重排链表

# Definition for singly-linked list.class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = nextclass Solution: def reorderList(self, head: ListNode) -> None: """ Do not return anything.

2020-10-20 09:34:28 13

原创 LeetCode 886 可能的二分法

给定一组N人(编号为1, 2, ..., N),我们想把每个人分进任意大小的两组。每个人都可能不喜欢其他人,那么他们不应该属于同一组。形式上,如果 dislikes[i] = [a, b],表示不允许将编号为 a 和 b 的人归入同一组。当可以用这种方法将所有人分进两组时,返回 true;否则返回 false。染色法from typing import *from collections import defaultdictclass Solution: def...

2020-10-18 07:33:44 13

原创 LeetCode 743 网络延迟问题

有N个网络节点,标记为1到N。给定一个列表times,表示信号经过有向边的传递时间。times[i] = (u, v, w),其中u是源节点,v是目标节点, w是一个信号从源节点传递到目标节点的时间。现在,我们从某个节点K发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回-1。注意本题的w可以取到0,因此图初始化时节点值得大小不能为0,可以设为-1。采用Dij算法解决from typing import *import sys...

2020-10-14 10:36:17 22

原创 LeetCode 310 最小高度树

对于一个具有树特征的无向图,我们可选择任何一个节点作为根。图因此可以成为树,在所有可能的树中,具有最小高度的树被称为最小高度树。给出这样的一个图,写出一个函数找到所有的最小高度树并返回他们的根节点。格式该图包含n个节点,标记为0到n - 1。给定数字n和一个无向边edges列表(每一个边都是一对标签)。你可以假设没有重复的边会出现在edges中。由于所有的边都是无向边, [0, 1]和[1, 0]是相同的,因此不会同时出现在edges里。第一感觉,最小高度树对应...

2020-10-13 09:08:07 26

原创 LeetCode 237 删除链表中的节点

请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点。传入函数的唯一参数为要被删除的节点。这道题是脑筋急转弯。由于没有传入头结点,因此被删除的节点不可能被删除。因此只能把该节点后面的值往前移动,然后删除后面的节点。注意不一定非得删除最后一个节点,删除后一个节点就行。class Solution: def deleteNode(self, node): """ :type node: ListNode :rtype: void..

2020-10-09 15:59:02 16

原创 LeetCode 25 K个一组翻转链表

给你一个链表,每k个节点一组进行翻转,请你返回翻转后的链表。k是一个正整数,它的值小于或等于链表的长度。如果节点总数不是k的整数倍,那么请将最后剩余的节点保持原有顺序。# Definition for singly-linked list.class ListNode: def __init__(self, x): self.val = x self.next = Noneclass Solution: def reverseK...

2020-10-09 15:50:22 24

原创 LeetCode 75 颜色分类

给定一个包含红色、白色和蓝色,一共n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、1 和 2 分别表示红色、白色和蓝色。双指针法,中轴排序也用到了同样的方法。from typing import *class Solution: def sortColors(self, nums: List[int]) -> None: """ Do not return anyth..

2020-10-07 08:50:00 40

原创 LeetCode 834 树中距离之和

给定一个无向、连通的树。树中有 N 个标记为 0...N-1 的节点以及 N-1条边。第 i 条边连接节点edges[i][0] 和 edges[i][1]。返回一个表示节点 i 与其他所有节点距离之和的列表 ans。参考标准解析:链接写的答案。from typing import *class Solution: def __init__(self): self.ans = None self.num_nodes = None ...

2020-10-06 12:11:33 56

原创 LeetCode 18 四数之和

给定一个包含n 个整数的数组nums和一个目标值target,判断nums中是否存在四个元素 a,b,c和 d,使得a + b + c + d的值与target相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含重复的四元组。需要去重,剪枝能够进一步缩短时间。from typing import *class Solution: def fourSum(self, nums: List[int], target: int) -> Lis...

2020-10-05 08:53:54 23

原创 LeetCode 72 编辑距离

给你两个单词word1 和word2,请你计算出将word1转换成word2 所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符class Solution { public int minDistance(String word1, String word2) { int len1=word1.length(); int len2=word2.length(); ...

2020-10-01 09:51:12 22

原创 LeetCode 08.11 硬币

硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007)class Solution: def waysToChange(self, n: int) -> int: dp = [0] * (n + 1) dp[0] = 1 for coin in {1, 5, 10, 25}: # 为了避免重复,一次首先使用一种找零方式

2020-10-01 09:45:49 15

原创 LeetCode 877 石子游戏

亚历克斯和李用几堆石子在做游戏。偶数堆石子排成一行,每堆都有正整数颗石子piles[i]。游戏以谁手中的石子最多来决出胜负。石子的总数是奇数,所以没有平局。亚历克斯和李轮流进行,亚历克斯先开始。 每回合,玩家从行的开始或结束处取走整堆石头。 这种情况一直持续到没有更多的石子堆为止,此时手中石子最多的玩家获胜。假设亚历克斯和李都发挥出最佳水平,当亚历克斯赢得比赛时返回true,当李赢得比赛时返回false。class Solution: def stoneGame(sel...

2020-10-01 08:57:18 22

空空如也

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除