算法笔记
JonassssRo
前奥林匹克首席云游泳大师。
展开
-
二叉树遍历非递归
preimport typingclass Solution: def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: if not root: return [] stack = [root] ans = [] while stack: cur = stack.pop() a原创 2022-03-03 14:52:42 · 290 阅读 · 0 评论 -
124. 二叉树中的最大路径和
124. 二叉树中的最大路径和import typingclass Solution: def __init__(self): self.ans = float('-inf') def maxPathSum(self, root) -> int: def helper(root): if not root: return 0 left = max(helper(root原创 2022-03-03 13:38:09 · 213 阅读 · 0 评论 -
买卖股票的最佳时机
买卖股票的最佳时机1class Solution: def maxProfit(self, prices: List[int]) -> int: dp = [[-1] * 2 for _ in range(len(prices))] dp[0][0] = 0 dp[0][1] = -prices[0] for i in range(1, len(prices)): dp[i][0] = max(dp[i-原创 2022-03-02 16:44:32 · 215 阅读 · 0 评论 -
56. 合并区间
56. 合并区间class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: ans = list() intervals.sort(key = lambda x : x[0]) start, end = intervals[0][0], intervals[0][1] for i in range(1,len(intervals)原创 2022-02-24 15:36:06 · 466 阅读 · 0 评论 -
刷题记录:241. 为运算表达式设计优先级
241. 为运算表达式设计优先级class Solution: def diffWaysToCompute(self, expression: str) -> List[int]: res = list() for idx, symbol in enumerate(expression): if symbol == '+' or symbol == '-' or symbol == '*': leftP原创 2022-02-23 19:59:40 · 66 阅读 · 0 评论 -
刷题记录:34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置class Solution {public: vector<int> searchRange(vector<int>& nums, int target) { if(nums.empty()) return vector<int>{-1, -1}; int left = left_bound(nums, target); if(left == -1) r原创 2022-02-21 11:47:03 · 99 阅读 · 0 评论 -
刷题记录:括号生成
括号生成class Solution: def generateParenthesis(self, n: int) -> List[str]: ans = [] n_left, n_right = 0,0 self.parenthesis = "" def backtracking(n_left,n_right,level): if level == 2*n: ans.ap原创 2021-12-29 15:24:26 · 157 阅读 · 0 评论 -
刷题记录:19. 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点class Solution {public: ListNode* removeNthFromEnd(ListNode* head, int n) { ListNode *p1 = head, *p2 = head; for(int i = 0; i < n; ++i){ p1 = p1->next; } if(p1 == nullptr){原创 2022-02-10 23:03:33 · 616 阅读 · 0 评论 -
刷题记录:10. 正则表达式匹配
10. 正则表达式匹配class Solution: def isMatch(self, s: str, p: str) -> bool: size_s, size_p = len(s), len(p) match = [[False for _ in range(size_p + 1)] for _ in range(size_s + 1)] for i in range(size_s + 1): for j in原创 2022-02-10 15:59:31 · 429 阅读 · 0 评论 -
刷题记录:752. 打开转盘锁
752. 打开转盘锁from queue import Queueclass Solution: def openLock(self, deadends: List[str], target: str) -> int: def turnUp(s, idx): if s[idx] == '9': s = s[:idx] + '0' + s[idx+1:] else:原创 2022-02-07 21:32:30 · 404 阅读 · 0 评论 -
刷题记录:70. 爬楼梯
70. 爬楼梯class Solution: def climbStairs(self, n: int) -> int: if n <= 2: return n pre, cur = 1, 2 for i in range(3,n+1): pre, cur = cur, pre + cur return cur原创 2022-02-03 19:49:16 · 709 阅读 · 0 评论 -
刷题记录:5. 最长回文子串
5. 最长回文子串class Solution: def longestPalindrome(self, s: str) -> str: n = len(s) l, r = 0, 0 dp = [[False] * n for _ in range(n)] for i in range(n): dp[i][i] = True for j in range(1,n):原创 2022-02-03 14:44:54 · 456 阅读 · 0 评论 -
刷题记录:3. 无重复字符的最长子串
3. 无重复字符的最长子串class Solution: def lengthOfLongestSubstring(self, s: str) -> int: cur_str = set() cur, longest = 0, 0 l, r, n = 0, 0, len(s) while r < n: if s[r] not in cur_str: cur_str.原创 2022-02-03 14:14:20 · 342 阅读 · 0 评论 -
刷题记录:2. 两数相加
2. 两数相加# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: p原创 2022-02-03 13:41:44 · 432 阅读 · 0 评论 -
刷题记录:打家劫舍123
打家劫舍1打家劫舍2打家劫舍31class Solution: def rob(self, nums): n = len(nums) if n == 1: return nums[0] pre, nxt = nums[0], max(nums[0], nums[1]) for i in range(2, n): pre, nxt = nxt, max(pre + nums[i],原创 2022-02-01 02:41:19 · 385 阅读 · 0 评论 -
刷题记录:647. 回文子串
647. 回文子串class Solution: def countSubstrings(self, s: str) -> int: n = len(s) dp = [[False] * n for _ in range(n)] count = n for i in range(n): dp[i][i] = True for j in range(1,n):原创 2022-02-01 02:04:08 · 434 阅读 · 0 评论 -
刷题记录:1143. 最长公共子序列
1143. 最长公共子序列常规动态规划class Solution: def longestCommonSubsequence(self, text1: str, text2: str) -> int: n1, n2 = len(text1), len(text2) dp = [[0] * (n2 + 1) for _ in range(n1 + 1)] for i in range(1, n1 + 1): for原创 2022-01-30 23:28:23 · 689 阅读 · 0 评论 -
刷题记录:416. 分割等和子集
416. 分割等和子集class Solution: def canPartition(self, nums: List[int]) -> bool: target = sum(nums) / 2 if target != int(target): return False n = len(nums) target = int(target) dp = [[False]原创 2022-01-30 21:28:24 · 540 阅读 · 0 评论 -
刷题记录:322. 零钱兑换12
322. 零钱兑换很常规的动规class Solution: def coinChange(self, coins: List[int], amount: int) -> int: dp = [float('inf') for _ in range(amount + 1)] dp[0] = 0 # print(dp) for i in range(1,amount+1): for coin in coi原创 2022-01-30 12:15:12 · 359 阅读 · 0 评论 -
刷题记录:538. 把二叉搜索树转换为累加树
538. 把二叉搜索树转换为累加树# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def convertBST(self, root:原创 2022-01-27 16:53:34 · 274 阅读 · 0 评论 -
刷题记录:347. 前 K 个高频元素
347. 前 K 个高频元素1 暴力计数+排序 O(nlogn)class Solution: def topKFrequent(self, nums: List[int], k: int) -> List[int]: count = collections.defaultdict(int) for val in nums: count[val] += 1 return sorted(coun原创 2022-01-23 16:46:01 · 304 阅读 · 0 评论 -
刷题记录:437. 路径总和 III
437. 路径总和 III方法1 爆搜 竟然不超时!~class Solution: def pathSum(self, root: TreeNode, targetSum: int) -> int: count = 0 def dfs(root, cur_sum): if not root: return if cur_sum + root.val == targetSum:原创 2022-01-22 21:58:33 · 1524 阅读 · 0 评论 -
刷题记录:312. 戳气球
312. 戳气球class Solution: def maxCoins(self, nums: List[int]) -> int: nums_extra = [1] + nums + [1] size = len(nums_extra) dp = [[0] * size for _ in range(size)] for len_of_sec in range(2, size): # enumerate differen原创 2022-01-22 20:25:03 · 252 阅读 · 0 评论 -
刷题记录:560. 和为 K 的子数组
560. 和为 K 的子数组class Solution: def subarraySum(self, nums: List[int], k: int) -> int: HashMap = {0:1} n = len(nums) count, pre = 0, 0 for i in range(n): pre += nums[i] if pre - k in HashMap:原创 2022-01-20 21:41:10 · 645 阅读 · 0 评论 -
刷题记录:543. 二叉树的直径
543. 二叉树的直径# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def diameterOfBinaryTree(self, r原创 2022-01-20 19:43:06 · 178 阅读 · 0 评论 -
刷题记录:删除无效的括号
删除无效的括号考虑到题目要求求出所有最长组合,考虑用暴力搜索尝试每一种情况,并在特定情况进行剪枝。import copyclass Solution: def removeInvalidParentheses(self, s): l_count, l_remove = 0, 0 r_count, r_remove = 0, 0 for i in s: if i == '(': l_count原创 2022-01-19 12:50:30 · 519 阅读 · 0 评论 -
刷题记录:反转二叉树
反转二叉树class Solution: def invertTree(self, root): def swap(node): if node == None: return node.right, node.left = node.left, node.right swap(node.left) swap(node.right) swa原创 2022-01-14 20:56:58 · 81 阅读 · 0 评论 -
刷题记录:207. 课程表
207. 课程表考查是否有环class Solution: def canFinish(self, numCourses, prerequisites): HashMap = {} for prerequisite in prerequisites: start, end = prerequisite[1], prerequisite[0] if start not in HashMap:原创 2022-01-14 20:06:03 · 86 阅读 · 0 评论 -
刷题记录:最大正方形
最大正方形class Solution: def maximalSquare(self, matrix): m, n = len(matrix), len(matrix[0]) # define the DP array dp = [[0] * n for _ in range(m)] # start DP maxArea = float("-inf") for i in range(m):原创 2022-01-07 20:58:37 · 75 阅读 · 0 评论 -
刷题记录:岛屿数量
岛屿数量class Solution: def numIslands(self, grid): m, n = len(grid), len(grid[0]) isUsed = [[False] * n for _ in range(m)] # print(isUsed) directions = [[1, 0], [-1, 0], [0, -1], [0, 1]] Islands = 0 def df原创 2022-01-07 20:57:11 · 330 阅读 · 0 评论 -
刷题记录:每日温度
每日温度class Solution: def dailyTemperatures(self, temperatures: List[int]) -> List[int]: stack = [] # to store the index res = [0] * len(temperatures) for day,temperature in enumerate(temperatures): while stack an原创 2022-01-07 13:24:28 · 79 阅读 · 0 评论 -
刷题记录:LRU
LRU# jonas 2022.1.6class Doublelist: def __init__(self, key=None, val=None, pre=None, _next=None): # key value pair self.key = key self.val = val # pointer to the pre,next node self.pre = pre self.next原创 2022-01-06 15:36:18 · 68 阅读 · 0 评论 -
刷题记录:二叉树展开为链表
二叉树展开为链表# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solution: def flatten(self, root: TreeNode) -原创 2022-01-05 20:06:34 · 572 阅读 · 0 评论 -
刷题记录:单词搜索
单词搜索class Solution: def exist(self, board, word): directions = [[-1, 0], [1, 0], [0, -1], [0, 1]] row, col = len(board), len(board[0]) matrix = [[True] * col for _ in range(row)] ans = False def backtracking(id原创 2022-01-05 16:56:18 · 170 阅读 · 0 评论 -
刷题记录:颜色分类
颜色分类class Solution: def sortColors(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ p0,p1 = 0,0 for index in range(len(nums)): if nums[index] == 0原创 2022-01-05 13:38:59 · 594 阅读 · 0 评论 -
刷题记录:最小路径和
最小路径和class Solution: def minPathSum(self, grid: List[List[int]]) -> int: dp = copy.deepcopy(grid) for i in range(1,len(grid)): dp[i][0] += dp[i-1][0] for j in range(1,len(grid[0])): dp[0][j] += dp[0][原创 2022-01-05 11:51:25 · 129 阅读 · 0 评论 -
刷题记录:最大子数组和
最大子数组和class Solution: def maxSubArray(self, nums: List[int]) -> int: if len(nums) == 1: return nums[0] dp = copy.deepcopy(nums) // travese from end to begin ans = nums[-1] for i in range(len(nums)原创 2022-01-04 15:30:28 · 244 阅读 · 0 评论 -
最小覆盖子串-滑动窗口
链接: 最小覆盖字串.from collections import defaultdictclass Solution: def minWindow(self, s: str, t: str) -> str: left,right = 0,0 minlen = float('INF') match = 0 start = 0 need = defaultdict(int) window = d原创 2021-03-08 16:50:49 · 98 阅读 · 0 评论 -
算法笔记(二)单调栈(1)最大矩形
单调栈也是算法题中常用的一种方法,这里总结一下思路先看一道题。链接: 84. 柱状图中最大的矩形.虽然题目的难度为hard,但是思路还是很好想到的,难点在于优化的部分。思路分析我们可以遍历每根柱子 i ,并且以当前柱子的高度 height[i] 作为此矩形 rectangle[i] 的高(假设矩形的高为竖直方向的,宽为水平方向)。对于此矩形的宽 width[i] ,我们可以以当前柱子为起始点,向左遍历每个柱子j,如果 height[j] > height[i] ,则 width[i] .原创 2020-12-26 20:30:19 · 236 阅读 · 0 评论 -
算法笔记(一)动态规划(3)按摩师
许多大厂的面试都会考动态规划,为了能过算法题这关,把自己做的题的思路总结一下,方便日后查阅。这次的题比之前两道题稍微有些变动。LeetCode 按摩师 simple直接先上代码看一下class Solution: def massage(self, nums: List[int]) -> int: lenght = len(nums) if not lenght: return 0 elif lenght =.原创 2020-12-21 16:51:35 · 280 阅读 · 2 评论