LeetCode
七月听雪
这个作者很懒,什么都没留下…
展开
-
726. 原子的数量
带括号的题一般都可以用栈来解决,比如(A(BC)2)3,处理完BC乘以2之后,到达后面的括号),不光A乘以3,BC也得乘以3。所以在栈里里面括号的信息,要更新在外面括号的信息。在栈里需要一个容器保存原子的个数。class Solution(object): def countOfAtoms(self, formula): N = len(formula) ...原创 2020-03-22 20:05:08 · 216 阅读 · 0 评论 -
25. K 个一组翻转链表
其实就是用栈就可以解决,主要就是代码的细节。# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def reverseKGroup(...原创 2020-03-21 07:23:10 · 73 阅读 · 0 评论 -
3. 无重复字符的最长子串
我第一个就是想到了动态规划,dp[ i ]代表以s[ i ]为结尾的不重复子串的最大长度。class Solution: def lengthOfLongestSubstring(self, s: str) -> int: if not s: return 0 if len(s)==1: ret...原创 2020-03-18 15:30:19 · 127 阅读 · 0 评论 -
222. 完全二叉树的节点个数
要求复杂度小于O(n),一提到复杂度小于O(n)就应该想到二分法。一开始想到的是对倒数第二行用二分法,但是要保存倒数第二行的结点需要层次遍历,复杂度是O(n)。所以就要从根结点开始每一层都用一次二分法,复杂度就是O(d**2) = O((logN)**2)。每一层的二分法的目的是找到最后一层的最后一个结点在目前这个结点的左子树还是右子树。# Definition for a bi...原创 2020-03-18 10:15:25 · 149 阅读 · 0 评论 -
114. 二叉树展开为链表
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(object):...原创 2020-03-13 14:40:08 · 87 阅读 · 0 评论 -
leetcode 132. 分割回文串 II
对于上图来说,整个字符串的切分次数就是两部分切分次数之和。dp[0:j]=dp[0:i-1]+dp[i:j] = dp[0:i-1]+1,由于i得再j以内得范围移动,所以要得到最小的dp[0:j]。class Solution: def minCut(self, s: str) -> int: min_cut = list(range(len(s)))...原创 2020-03-13 09:41:34 · 90 阅读 · 0 评论 -
146. LRU缓存机制
class DLinkedNode(): def __init__(self): self.key = 0 self.value = 0 self.prev = None self.next = None class LRUCache(): def _add_node(self, ...原创 2020-03-12 19:44:25 · 78 阅读 · 0 评论 -
leetcode 14. 最长公共前缀
分治法:上面这个图是从原理的角度来理解分治方法的, 起始还可以从二叉树的角度来理解。在分治的"分"的过程中,不是一下子就把所有的最小粒度的情况取出来的。在二叉树中不是所有的叶结点一下子展开的,而是通过向下去探索,找到一个就处理一个,并把结果返回。伪代码如下(用递归实现分治):def f(父节点): if 判断是叶结点的条件: return 返回...原创 2020-03-11 16:28:32 · 114 阅读 · 0 评论 -
leetcode35. 搜索插入位置 二叉搜索法
二叉搜索有闭区间和左闭右开区间的两种方法:闭区间模板:左闭右开区间模板:class Solution(object): def searchInsert(self, nums, target): """ :type nums: List[int] :type target: int :rtype: ...原创 2020-02-23 18:52:32 · 106 阅读 · 0 评论 -
81. 搜索旋转排序数组 II
就是在判断条件的时候加上一个等号,而且考虑一下left=mid=right的情况。class Solution(object): def search(self, nums, target): if len(nums)==0: return False left = 0 if nums[left]==targ...原创 2020-02-23 17:50:20 · 87 阅读 · 0 评论 -
leetcode33. 搜索旋转排序数组 字节跳动笔试题
当时要求我的复杂度小于o(n),我就理解为不能用遍历,其实小于o(n)最直接的不就是o(logn)吗!还是查找的一道题,很容易就想到二分查找吗!!!这个题主要的难点就在于他是两个独立的单调的区间,所以区间边界的移动规则就得修改。在上图target落在左区的这种情况,首先小于target的数据,在左区间和右区间都有分布,所以如果mid<target,并不知道mi...原创 2020-02-23 17:07:20 · 172 阅读 · 0 评论 -
leetcode 153. 寻找旋转排序数组中的最小值
class Solution(object): def findMin(self, nums): """ :type nums: List[int] :rtype: int """ if len(nums)==1 or nums[-1]>nums[0]: return ...原创 2020-02-23 10:31:54 · 85 阅读 · 0 评论 -
leetcode695. 岛屿的最大面积
首先想到了动态规划,遍历到某个位置,dp[ i ][ j ] = dp[ i ][ j-1 ]+dp[ i-1 ][ j ]+1,但是这个位置前面位置的面积和上面位置的面积很可能有交集。又想到可以按行动态规划,dp[ i ][ j ] = dp[ i-1 ][ j ]+1+[ i , j ]相邻1的个数class Solution(object): def maxArea...原创 2020-02-19 20:04:36 · 196 阅读 · 0 评论 -
leetcode351 安卓系统手势解锁
注意:9 ——> 2没有经过任何点 要求2的意思是:手势里不能有重复的点class Solution: def numberOfPatterns(self, m: int, n: int) -> int: self.res = 0 all_set = set(range(1, 10)) ...原创 2020-02-19 18:23:38 · 1053 阅读 · 2 评论 -
leetcode295. 数据流的中位数
import heapqclass MedianFinder: def __init__(self): # s:最大堆(保存较小的部分) l:最小堆(保存较大的部分) self.s, self.l = [], [] def addNum(self, num: int) -> None: # 最大堆和最小...原创 2020-02-12 19:24:27 · 94 阅读 · 0 评论 -
leetcode 215. 数组中的第K个最大元素
堆排序:import heapqclass Solution(object): def findKthLargest(self, nums, k): """ :type nums: List[int] :type k: int :rtype: int """ count = 0...原创 2020-02-12 18:33:31 · 118 阅读 · 0 评论 -
leetcode225_用队列实现栈
用两个队列实现栈:要弹出队列队尾的元素,就可以前面所有的都先当道另一个队列里,当对尾元素到了队头时候,在让它弹出。from queue import Queueclass MyStack: def __init__(self): """ Initialize your data structure here. """ ...原创 2020-02-09 20:21:54 · 148 阅读 · 0 评论 -
42. 接雨水
最开始是想的按照水平线一步一步向上移动的做法求出结果,但是比较麻烦,要记录什么时候开始统计0的个数什么的。另外的解法就是求出每一个柱子上面能盛多少水。他能盛多少水,跟它左边最大高度,右边最大高度和它自身的高度有关。所以通过找到每一个柱子的左右最高高度就能算出他能盛多少水。class Solution: def trap(self, height: List[int]) -&g...原创 2020-01-22 17:55:59 · 106 阅读 · 0 评论 -
84. 柱状图中最大的矩形
https://blog.csdn.net/qq_23262411/article/details/103593476 和这个题有点像。对于单调的排列情况是最简单的,以每一个位置为起点找形成的最大矩形,因为排列是单调的,所以后面的要比这个位置高,也就是该位置是最低的一个位置,这个位置的高度也就是这个矩形的高度。最大矩形的长度就应该是从这个位置到单调排列末尾的距离。在一...原创 2020-01-16 21:46:38 · 97 阅读 · 0 评论 -
85. 最大矩形
方法一:class Solution: def maximalRectangle(self, matrix: List[List[str]]) -> int: if not matrix: return 0 m = len(matrix) n = len(matrix[0]) left = [0] * n ...原创 2020-01-12 17:40:19 · 194 阅读 · 0 评论 -
572. 另一个树的子树
# Definition for a binary tree node.# class TreeNode(object):# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution(object): ...原创 2020-01-09 10:45:14 · 101 阅读 · 0 评论 -
28. 实现 strStr()
这个题主要是要用KMP求解。KMP是一种用空间换时间的算法。它的特点是主串的指针不往回走,利用存储好的信息,避免重复的运算。 要利用的信息存储在 部分匹配表(Partial Match Table)PMT: PMT中的值是字符串的前缀集合与后缀集合的交集中最长元素的长度。 例如,对于”aba”,它的前缀集合为{”a”, ”...原创 2019-12-25 09:45:34 · 280 阅读 · 0 评论 -
10. 正则表达式匹配
主要的问题就是 * 重复几次。对于* 前面不是 . 的情况,* 的后面的字符和 * 前面的字符一样的话,如果 * 直接把S里的字符都匹配完了,后面同样的字符就不能匹配了。所以遇到 * 的情况,就要考虑* 的后面字符。 但是遇到* 前面是 . 就不好使了。。。。。 因为 . 可以匹配任意一位字符,之前的判断的当时都不能找出 * 重复多少次。class S...原创 2019-12-24 16:39:25 · 112 阅读 · 0 评论 -
0-1背包
import numpy as npdef solve(vlist,wlist,totalWeight,totalLength): resArr = np.zeros((totalLength+1,totalWeight+1),dtype=np.int32) for i in range(1,totalLength+1): for j in range...原创 2019-12-22 10:50:15 · 133 阅读 · 0 评论 -
416. 分割等和子集
class Solution: def canPartition(self, nums: List[int]) -> bool: size = len(nums) # 特判,如果整个数组的和都不是偶数,就无法平分 s = sum(nums) if s & 1 == 1: retur...原创 2019-12-22 09:59:28 · 156 阅读 · 0 评论 -
贪心算法
贪心算法在每一步只保存当前的最优解,下一步的操作只能基于前一步的这个最优解。动态规划在每一步不知保存最优解而是保存所有的有用解,下一步操作基于这些所有的解。...原创 2019-12-21 19:48:44 · 71 阅读 · 0 评论 -
402. 移掉K位数字
其实它这样做的目的就是说,从高位开始找到递增数列的尾部数字,就把这个数字去掉。它的原理就是高位增加的量是后面低位怎么减小也弥补不了的。所以要保证高位尽量都是减小的,后面的不动就可以。这样就是抽取某一个数字最好的方法。class Solution: def removeKdigits(self, num: str, k: int) -> str: if...原创 2019-12-21 18:00:15 · 101 阅读 · 0 评论 -
134. 加油站
class Solution: def canCompleteCircuit(self, gas, cost): """ :type gas: List[int] :type cost: List[int] :rtype: int """ n = len(gas) ...原创 2019-12-21 11:51:07 · 162 阅读 · 0 评论 -
216. 组合总和 III
class Solution: def combinationSum3(self, k: int, n: int) -> List[List[int]]: res = [] def help(tmp,i): if sum(tmp)==n and len(tmp)==k: res.append...原创 2019-12-20 22:03:35 · 99 阅读 · 0 评论 -
77. 组合
class Solution: def combine(self, n: int, k: int) -> List[List[int]]: res = [] # i记录当前有哪些数字已经遍历过 def help(tmp,i): if len(tmp)==k: res.app...原创 2019-12-20 20:53:00 · 94 阅读 · 0 评论 -
47. 全排列 II
class Solution: def permuteUnique(self, nums: List[int]) -> List[List[int]]: nums.sort() res = [] def help(tmp,nums): if not nums: res.app...原创 2019-12-20 20:29:17 · 69 阅读 · 0 评论 -
46. 全排列
class Solution: def permute(self, nums: List[int]) -> List[List[int]]: # 记录全部排列解的全局变量 res = [] # tmp记录临时路径 def backtrack(nums, tmp): # 获得可行解 ...原创 2019-12-20 19:55:14 · 73 阅读 · 0 评论 -
17. 电话号码的字母组合
这个用回溯法,树的结构是排列树。节点生枝的方式就是添加下一位数字对应的字母。class Solution: def letterCombinations(self, digits): """ :type digits: str :rtype: List[str] """ phone = {'2...原创 2019-12-20 16:23:33 · 111 阅读 · 0 评论 -
40. 组合总和 II
回溯法就是从根节点也就是要求的结果开始向下遍历,逐渐向下搜素,搜索到没有必要继续搜索的节点就把它剪枝,搜索到满足条件的就把它保存下来。 现在就是怎么让节点生出枝来,以这个题为例,从根节点开始,应该是从给到列表的头开始依次往里添加节点。其他中间节点的时候,由于不能重复添加,就要从未添加的数值里做尝试。为了区分已经添加的数值和未添加的数值可以用一个变量i来记录已...原创 2019-12-20 15:57:21 · 67 阅读 · 0 评论 -
39. 组合总和
一上来看到每一个数字都是可以重复选取,感觉不能用回溯的方法,因为不能标志某一个数字有没有被选取过。我想用栈的方式,但是找不到一个规则能把所有的情况遍历够。其实还是可以用回溯的方法解决的,只不过和之前的有点不同。class Solution: def combinationSum(self, candidates: List[int], target: int) -> L...原创 2019-12-19 21:36:22 · 65 阅读 · 0 评论 -
79. 单词搜索
其实就是回溯法,用一个和网格一样大的二维数组,来标记某一个位置是否被遍历过了。class Solution(object): # 定义上下左右四个行走方向 directs = [(0, 1), (0, -1), (1, 0), (-1, 0)] def exist(self, board, word): """ :type ...原创 2019-12-18 20:51:11 · 73 阅读 · 0 评论 -
22. 括号生成
它看似括号应该和栈有关系,其实他是个动态规划。在已知n = i 时候的情况,n = i+1时候,就相当于往n = i 的情况里添加一对括号。但是不能瞎填,不能在括进去格式不对的部分。为了保证这一点,其实 n<i 时候就已经能保证格式是有效的。所以就括进去之前的部分的就可以。 这个想法确实很巧妙啊,我之前就想从里面扣除成对的括号,其实n=i不只和n=i-1有关系。...原创 2019-12-18 16:50:06 · 80 阅读 · 0 评论 -
20. 有效的括号
就是栈的简单应用class Solution: def isValid(self, s: str) -> bool: left = ["(","{","["] stack = [] for i in s: if i in left: stack.append(i) ...原创 2019-12-18 15:36:08 · 56 阅读 · 0 评论 -
19. 删除链表的倒数第N个节点
可以用队列来解决,不过队列的长度要等于n+1,因为要删除倒数第n个节点,就得让第n+1个元素指向第n-1节点。# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass...原创 2019-12-18 14:46:55 · 84 阅读 · 0 评论 -
11. 盛最多水的容器
首先肯定是暴力解法,不出意外成功超时。。。。class Solution: def maxArea(self, height: List[int]) -> int: if len(height)<=1: return 0 cur = 0 res = 0 for i in range...原创 2019-12-18 14:12:51 · 92 阅读 · 0 评论