![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法刷题笔记
江小北
每想你一次,天上飘落一粒沙,从此形成了撒哈拉。每想你一次,天上就掉下一滴水,于是形成了太平洋。
展开
-
85. 最大矩形
class Solution: def maximalRectangle(self, matrix) -> int: if len(matrix) == 0: return 0 res = 0 m, n = len(matrix), len(matrix[0]) heights = [0] * n for i in range(m): for j in range..原创 2022-02-14 13:01:46 · 176 阅读 · 0 评论 -
84. 柱状图中最大的矩形
class Solution: def largestRectangleArea(self, heights: List[int]) -> int: stack = [] n = len(heights) # 给数组头尾添加0高度,方便出栈 heights = [0] + heights + [0] res = [0] * (n+2) # 结果数组 # 单调栈思想,以当前高度为高的矩形有多大.原创 2022-02-14 11:10:45 · 159 阅读 · 0 评论 -
532. 数组中的 k-diff 数对
class Solution: def findPairs(self, nums: List[int], k: int) -> int: res = set() seen = set() for i, num in enumerate(nums): if num - k in seen: res.add((num - k, num)) if num + k in s.原创 2021-10-20 23:24:59 · 99 阅读 · 0 评论 -
1552. 两球之间的磁力
class Solution: def maxDistance(self, position: List[int], m: int) -> int: # 二分 def check(x): pre = position[0] cnt = 1 for i in range(1, len(position)): if position[i] - pre >=.原创 2021-10-20 22:15:09 · 128 阅读 · 0 评论 -
1975. 最大方阵和
class Solution: def maxMatrixSum(self, matrix: List[List[int]]) -> int: less_zero = 0 min_num = float('inf') sum_num = 0 for i in range(len(matrix)): for j in range(len(matrix[0])): if ma..原创 2021-10-13 23:58:01 · 113 阅读 · 0 评论 -
1974. 使用特殊打字机键入单词的最少时间
class Solution: def minTimeToType(self, word: str) -> int: word = 'a' + word ans = 0 for i in range(1, len(word)): tmp = abs(ord(word[i]) - ord(word[i-1])) if tmp > 13: ans = ans +..原创 2021-10-13 23:27:38 · 144 阅读 · 0 评论 -
873. 最长的斐波那契子序列的长度
class Solution: def lenLongestFibSubseq(self, A: List[int]) -> int: # 基本顺序是 k,i,j 或者 A[k] = A[j] - A[i] n = len(A) dic = {} # 创建索引字典,提速 for ind,val in enumerate(A): dic[val] = ind # 初始化,...原创 2021-10-10 17:36:50 · 107 阅读 · 0 评论 -
1208. 尽可能使字符串相等
class Solution: def equalSubstring(self, s: str, t: str, maxCost: int) -> int: start = 0 end = 0 ans = 0 res = 0 while end < len(s) and start < len(s): ans = ans + abs(ord(s[end])-ord(t[end].原创 2021-10-09 11:59:22 · 86 阅读 · 0 评论 -
1207. 独一无二的出现次数
class Solution: def uniqueOccurrences(self, arr: List[int]) -> bool: d={} for i in arr: d[i]=d.get(i,0)+1 s=[d[i] for i in d] return len(set(s))==len(s)原创 2021-10-09 11:11:24 · 80 阅读 · 0 评论 -
数位DP笔记
class Solution: def atMostNGivenDigitSet(self, digits: List[str], n: int) -> int: n = str(n)[::-1] dp = [-1] * len(n) def dfs(cur, limit): if cur == -1: return 1 if not limit and dp..原创 2021-10-08 22:48:35 · 86 阅读 · 0 评论 -
1433. 检查一个字符串是否可以打破另一个字符串
class Solution: def checkIfCanBreak(self, s1: str, s2: str) -> bool: s1 = sorted(s1) s2 = sorted(s2) return all(s1[i] >= s2[i] for i in range(len(s1))) or \ all(s2[i] >= s1[i] for i in range(len(s1)))原创 2021-10-07 20:47:45 · 87 阅读 · 0 评论 -
1432. 改变一个整数能得到的最大差值
class Solution {public: int maxDiff(int num) { auto replace = [](string& s, char x, char y) { for (char& digit: s) { if (digit == x) { digit = y; } } ..原创 2021-10-07 20:06:34 · 90 阅读 · 0 评论 -
402. 移掉 K 位数字
单调栈class Solution: def removeKdigits(self, num: str, k: int) -> str: stack = [] remove_num = 0 for i in range(len(num)): while stack and num[i] < stack[-1] and k > remove_num: stack.pop() .原创 2021-10-07 16:05:29 · 109 阅读 · 0 评论 -
397. 整数替换
class Solution: def integerReplacement(self, n: int) -> int: if n == 1: return 0 if n % 2 == 0: return self.integerReplacement(n // 2) + 1 else: return min(self.integerReplacement(n-1), se.原创 2021-10-07 13:53:59 · 79 阅读 · 0 评论 -
473. 火柴拼正方形
class Solution: def makesquare(self, matchsticks: List[int]) -> bool: if sum(matchsticks) % 4 != 0: return False edge_length = sum(matchsticks) // 4 if max(matchsticks) > edge_length: return False.原创 2021-10-05 18:14:08 · 107 阅读 · 0 评论 -
用 Rand7() 实现 Rand10()
# The rand7() API is already defined for you.# def rand7():# @return a random integer in the range 1 to 7class Solution: def rand10(self): """ :rtype: int """ while True: index = (rand7() - 1) * 7 + rand.原创 2021-10-05 17:03:15 · 101 阅读 · 0 评论 -
467. 环绕字符串中唯一的子字符串
from collections import defaultdictclass Solution: def findSubstringInWraproundString(self, p: str) -> int: dic = defaultdict(int) dic[p[0]] = 1 tmp = 1 for i in range(1, len(p)): if (ord(p[i]) - ord(p[.原创 2021-10-05 16:36:34 · 84 阅读 · 0 评论 -
有效三角形个数
class Solution: def triangleNumber(self, nums: List[int]) -> int: # 对数组排序 nums.sort() ans = 0 for i in range(len(nums)-2): for j in range(i+1, len(nums)-1): left = j + 1 ri.原创 2021-09-23 23:12:05 · 93 阅读 · 0 评论 -
零钱兑换II
class Solution: def change(self, amount: int, coins: List[int]) -> int: # 完全背包 dp = [0] * (amount + 1) dp[0] = 1 for i in range(len(coins)): for j in range(1,amount+1): if j - coins[i] >.原创 2021-09-10 15:27:47 · 96 阅读 · 0 评论 -
67. 二进制求和
不调包class Solution: def addBinary(self, a, b): # res 用于保存结果 从左向右对应从低位到高位 res = [] # tmp 保存向前进的位数 tmp = 0 # 开始计算 两者对应位置都有数的部分 i, j = len(a)-1, len(b)-1 while i>=0 and j>=0: n1, n.原创 2021-05-06 10:05:30 · 82 阅读 · 0 评论 -
155. 最小栈
class MinStack(object): def __init__(self): """ initialize your data structure here. """ self.stack = [] self.min_val = [] # 辅助栈 def push(self, val): """ :type val: int :rtype: ..原创 2021-05-04 11:37:44 · 86 阅读 · 0 评论 -
17. 电话号码的字母组合
深度搜索class Solution: def letterCombinations(self, digits: str) -> List[str]: ans = [] if not digits: return ans phoneMap = { "2": "abc", "3": "def", "4": "ghi", "5..原创 2021-05-04 11:33:20 · 124 阅读 · 0 评论 -
13. 罗马数字转整数
class Solution: def romanToInt(self, s: str) -> int: dic = {"#":-1, 'I':1, 'V':5, "X":10, "L":50, "C":100, "D":500, "M":1000} s = s + "#" ans = 0 pre = s[0] i = 1 while i < len(s): if ..原创 2021-05-04 10:26:32 · 79 阅读 · 0 评论 -
554. 砖墙
计算缝隙个数的和,缝隙就是前面的和class Solution: def leastBricks(self, wall: List[List[int]]) -> int: dic = {-1:0} for num in wall: total = 0 for i in range(len(num)-1): total = total + num[i] ...原创 2021-05-03 13:31:53 · 89 阅读 · 0 评论 -
692. 前K个高频单词
class Solution: def topKFrequent(self, words: List[str], k: int) -> List[str]: dic = {} for word in words: if word in dic: dic[word] = dic[word] + 1 else : dic[word] = 1 .原创 2021-05-03 12:57:53 · 84 阅读 · 0 评论 -
690. 员工的重要性
按照题意可知是一颗树, 因为直系领导一个就是父节点,但是子节点可以有很多个,也就是可以有很多直系下属。深度搜索"""# Definition for Employee.class Employee: def __init__(self, id: int, importance: int, subordinates: List[int]): self.id = id self.importance = importance self.subor.原创 2021-05-03 11:58:59 · 97 阅读 · 0 评论 -
855. 考场就座
import bisectclass ExamRoom: def __init__(self, N): self.N = N # 记录学生的位置 self.students = [] def seat(self): # 还没有学生,直接坐在第一个位置 if not self.students: student = 0 else: # 有学.原创 2021-05-02 21:10:09 · 112 阅读 · 0 评论 -
773.滑动谜题
class Solution: def slidingPuzzle(self, board): res = [] board_res = [[1, 2, 3], [4, 5, 0]] ans = 0 if board == board_res: return ans q = [board] new = [[-1, 0], [0, 1], [1, 0], [0, -1]] ..原创 2021-04-25 19:48:19 · 97 阅读 · 0 评论 -
187. 重复的DNA序列
class Solution: def findRepeatedDnaSequences(self, s: str) -> List[str]: res = [] # 滑动窗口 i = 0 j = 10 dic = {} while j <= len(s): if s[i:j] not in dic: dic[s[i:j]] = 1 .原创 2021-04-29 12:32:39 · 93 阅读 · 0 评论 -
1013. 将数组分成和相等的三个部分
class Solution: def canThreePartsEqualSum(self, arr: List[int]) -> bool: total = sum(arr) if total % 3 != 0: return False part1 = 0 part2 = 0 part3 = -1 for i in range(len(arr)-1): .原创 2021-04-29 10:31:33 · 114 阅读 · 0 评论 -
875. 爱吃香蕉的珂珂
class Solution: def minEatingSpeed(self, piles: List[int], H: int) -> int: left = 1 right = sum(piles) while left < right: mid = (left + right) // 2 h = self.check(piles, mid) if h >.原创 2021-04-29 08:22:16 · 92 阅读 · 0 评论 -
1011. 在 D 天内送达包裹的能力
首先这艘船的重量是固定的, 货物的运输顺序必须按照数组weights的顺序来, 不能打乱顺序. 那么我们可以想到这艘船最小的运载能力必须是所有货物中最重的那一件max(weights), 否则无法完成运输的任务. 这艘船最大的运载能力就是一次性把所有的货都搬走, 就是sum(weights). 所以答案就在区间[max(weights), sum(weights)]之间啦!题目的考点最后落到二分搜索. 这里有一些明显的使用二分搜索的特征:答案区间已经有序;最优解在答案区间内class Solut...原创 2021-04-29 08:12:14 · 71 阅读 · 0 评论 -
1010. 总持续时间可被 60 整除的歌曲
class Solution: def numPairsDivisibleBy60(self, time: List[int]) -> int: ans = 0 dic = {} for i in range(len(time)): if time[i] % 60 in dic: dic[time[i] % 60] = dic[time[i] % 60] + 1 e.原创 2021-04-27 12:37:03 · 81 阅读 · 0 评论 -
1007. 行相等的最少多米诺旋转
class Solution: def minDominoRotations(self, A: List[int], B: List[int]) -> int: def check(x): rotations_a = rotations_b = 0 for i in range(n): if A[i] != x and B[i] != x: ..原创 2021-04-27 11:37:15 · 91 阅读 · 0 评论 -
双栈系列(计算表达式)
class Solution: op_priority = {'+': 0, '-': 0, '*': 1, '/': 1, '%': 1, '^': 2} def calculate(self, s: str) -> int: s = "(" + s.replace(" ", "").replace("(-", "(0-") + ")" n = len(s) # operators & numbers op_.原创 2021-04-26 22:34:12 · 281 阅读 · 0 评论 -
728. 自除数
class Solution: def selfDividingNumbers(self, left: int, right: int) -> List[int]: def func(num): str_num = str(num) for char in str_num: if char == "0" or num % int(char) != 0: re.原创 2021-04-26 21:51:04 · 94 阅读 · 0 评论 -
724. 寻找数组的中心下标
class Solution: def pivotIndex(self, nums: List[int]) -> int: nums = [0] + nums + [0] left = 0 right = sum(nums) for i in range(1, len(nums)-1): left = left + nums[i-1] right = right - nums[i..原创 2021-04-26 15:51:56 · 87 阅读 · 0 评论 -
720. 词典中最长的单词
记录每一个单词的前缀,看前缀是否在集合中,如果前缀都在集合中,则添加单词,最后求最长的最小单词。class Solution(object): def longestWord(self, words): ans = [] wordset = set(words) for word in words: flag = 1 for i in range(1,len(word)): .原创 2021-04-26 11:51:33 · 104 阅读 · 1 评论 -
777. 在LR字符串中交换相邻字符
class Solution: def canTransform(self, start: str, end: str) -> bool: if start.replace('X', "") != end.replace("X", ""): return False i, j = 0, 0 while i < len(start) and j < len(end): while i &.原创 2021-04-25 22:14:52 · 97 阅读 · 0 评论 -
775. 全局倒置与局部倒置
class Solution: def isIdealPermutation(self, nums: List[int]) -> bool: min_A = [0] * len(nums) min_A[-1] = nums[-1] for i in range(len(nums)-2, -1, -1): min_A[i] = min(min_A[i+1], nums[i]) for i in range(.原创 2021-04-25 21:36:19 · 94 阅读 · 0 评论