自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode 341. Flatten Nested List Iterator

LeetCode 341最简单的做法我想应该是把所有的都先flatten成一个list,然后可以很容易的iterator。这样做内存占用量比较大,并且一次性的全部flatten掉,第一次初始化的时间比较旧。如果完全不做任何flatten,然后通过指针来指向内部的nestedInteger,我们也不知道有多少层,并且还要处理【】这种空串的特殊case,感觉不是很好写。想了一个折衷的方案,每次只...

2020-04-30 04:40:35 95

原创 LeetCode 124. Binary Tree Maximum Path Sum

LeetCode 124这个题目其实和543很类似,参考另外一篇博文: https://editor.csdn.net/md/?articleId=105592543对于每个节点,我们找到使用了这个节点的partial的max,意思就是只是自己,或者自己加上左树或者右树的最大可能,这样他的父节点是可以与之组合变成更大的可能的。另外一种情况就是最大和节点就在自己的节点的子树中,那么我们返回这个最...

2020-04-30 02:26:23 60

原创 Leetcode 1005. Maximize Sum Of Array After K Negations

LeetCode 1005这个题目咋一看觉得不容易,但是其实想清楚规则之后其实还是很容易的。为了得到最大的和,我们尽量利用K次的机会把大的负数转为正数。如果K小于负数的个数,那么我们就把K全部消耗在大的负数上。如果有多余的K,如果能被2整除,其实什么都不用变,两次取负数,那么就变回正的了;如果余数是1,那么就应用到最小的那个数上。 def largestSumAfterKNegatio...

2020-04-29 09:39:15 60

原创 LeetCode 173. Binary Search Tree Iterator

LeetCode 173最简单的方法就是,先把树flatten中序遍历成一个list,然后在next中逐个返回。但是note中有一个条件,空间复杂度只能是O(h),那么我们不能把整个树转为list存下来。第一个想到的就是利用stack来做中序遍历,中序遍历基于stack的方法是:def inOrder(root): current = root stack = [] ...

2020-04-29 07:55:09 77

原创 FB phone screen cut wood

听朋友说的这个题目,大概如下:Given an int array wood representing the length of n pieces of wood and an int k. It is required to cut these pieces of wood such that more or equal to k pieces of the same length len ...

2020-04-28 06:50:45 103

原创 LeetCode 221. Maximal Square

LeetCode 221首先我们考虑怎么找square,对于【i,j】,如果【i-1,j-1】是个square,【i,j】的行和列的长度都长于【i-1,j-1】的square,那么我们就组成一个更大的square。基于这个想法,我们就不断的求解行长和列长以及square的长度,然后求出最大的area。 def maximalSquare(self, matrix: List[List[s...

2020-04-28 04:07:12 93

原创 LeetCode 900 RLE Iterator

LeetCode 900思路还是比较简单的,用两个指针来确定当前的位置,一个用于指向当前在数组中的位置,另外一个看当前位置上的已经用掉了几个,如果用完了,那么我们需要移动第一个指针,有定类似于进位。只是里面的一些细节需要注意。class RLEIterator: def __init__(self, A: List[int]): self.a = A ...

2020-04-27 11:36:12 102

原创 LeetCode1143. Longest Common Subsequence

LeetCode 1143刚看到这个题目,考虑了dp,但是一下没有想到简单的状态转移方法。所以开始考虑其他方法,首先想到的是递归求解,比如 “abcde” 和“ace", 我们可以把这个问题分成两个子问题,最后的“e"在最长公共字串中用到了,还有一种是这个e没有用到。这样我们可以不断的递归减短这个字符串,直到字符串长度为0.写成递归的代码: def longestCommonSubse...

2020-04-27 05:58:19 155

原创 LeetCode 55. Jump Game

LeetCode 55我想到的第一个办法是dp,用个数组记录下来是否可以reach到这个位置,如果可以那么根据当前能向前跳的长度继续向前看是否可以reach到那些位置。代码很简单: def canJumpTimeOut(self, nums: List[int]) -> bool: nl = len(nums) dp = [False]*nl ...

2020-04-26 02:55:04 62

原创 LeetCode 373 Find K Pairs with Smallest Sums

LeetCode 373这个题目其实有点类似于merge sort,只是merge的来源要我们自己来控制。比如有数组u:【1, 7, 11】v:【2, 4, 6】最小的,很显然是【1,2】(位置(u0,v0)),数组头上两个最小的相加,自然是最小的。接下去应该是什么呢,可能是【1,4】 或者【2,7】,其实就是就u0是当前u中最小的,那么把v0向后移动一个取v1,或者固定v0,然后取u1...

2020-04-26 02:01:21 96

原创 LeetCode 1286 iterator-for-combination

LeetCode 1286iterator的主要方法就是hasNext 和Next,首先我么你要找到要遍历的对象。这里是要按照字母序来遍历。通常给出的例子过于简单,如果只是看这个例子,容易落入陷阱。我们自己还是找一个稍微复杂一点的例子来看。比如 “abcde“,3: 那么我们的答案是abcacdadebcdbdecde要做这个iterator,我们需要K个指针指向这些字母,然后控制...

2020-04-25 05:45:28 134

原创 LeetCode 146 LRU Cache

LeetCode 146如果是普通的LRU cache,我们会想到,使用一个list,每次访问一个value之后,我们可以把这个value放到队尾,然后cache 满的时候需要pop的话,pop掉头上的一个。这样做的问题就是不能达到O(1),我们如何快速的能找到这个value呢。一个简单的方法可以考虑的就是为它建立索引,通过dictionary记录住这个索引,那么就可以O(1)找到这个valu...

2020-04-25 05:33:29 77

原创 LeetCode 201 bitwise-and-of-numbers-range

LeetCode 201最直接的方法就是iterator每个数字,然后直接求and的结果,这个效率会比较低。我们考虑,因为是求and,只要有某个数的这个位置是0,那么结果中同位置就会是0。那么我们可以想象,可能存是这种情况: m<2^x<n,如果是这样的,结果就是0,2 ^x 是 10…0, m肯定是01xxxx,而y是1xxxxx,最后的结果就是0如果只有 是 2^x <...

2020-04-24 02:57:20 88

原创 LeetCode 560 subarray-sum-equals-k

LeetCode 560这个题目和之前做过的这个:https://editor.csdn.net/md/?articleId=105525968是非常类似。基本的思路就是把presum先求出来放在dictionary里面,每次新的presum去看看和之前的是否差K。 def subarraySum(self, nums: List[int], k: int) -> int:...

2020-04-23 06:02:42 100

原创 LeetCode 374, 375 Guess Number

LeetCode 374这个题目相对还是比较容易的,每次猜了结果之后分成两部分,使用二叉查找的方式来做就可以了。 def guessNumber(self, n: int) -> int: low = 1 high = n while low <= high: mid = low + ((high - ...

2020-04-23 04:47:17 79

原创 LeetCode build tree questions

二叉树的建树和序列化问题有很多,中序加后序建树https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/前序建搜索树https://leetcode.com/problems/construct-binary-search-tree-from-preorder-trave...

2020-04-21 14:33:53 169

原创 LeetCode 87 scramble-string

LeetCode 87一开始我的思路是把所有的scramble的strings都求出来,然后看看另外一个是否在里面。快速可以优化的地方就是记住已经求过的scramble的strings。代码相对比较容易,每次把string都拆成两部分,然后求scramble的strings,再组合在一起: def isScrambleSlow(self, s1: str, s2: str) ->...

2020-04-21 06:28:58 121

原创 LeetCode 863 all-nodes-distance-k-in-binary-tree

LeetCode 863这个题目应该还是挺直接的,因为是要找K distance的所有node,只需要用BFS做K层查找就可以了。唯一的一点是怎么找回parent节点,这个我们可以使用一次树的遍历建立和parent直接的hash table。 def distanceK(self, root: TreeNode, target: TreeNode, K: int) -> List...

2020-04-20 12:55:58 96

原创 LeetCode 1044 longest-duplicate-substring

LeetCode 1044在确定长度的时候使用RK来进行查找,然后用2叉查找来找到对应的长度。class Solution: def __init__(self): self.M = 1000000000000000003 self.R = 26 self.RK = 1 def longestDupSubstring(self,...

2020-04-20 09:44:54 194

原创 LeetCode 33, 81 Search in Rotated Sorted Array

LeetCode 33在一个被rotated过的数组中搜索,而且这个数组也是排序过的。如果说没有被rotated过,是可以直接二分查找的。但是由于根据某个节点做了rotation,那么稍微不同了。我们来分析一下,被rotated过之后数组其实是分成两段A段,上升B段,也是上升,但是总体小于A【0】加入我们还是用二分法,选一个mid,如果落在了A段,nums[mid] > targ...

2020-04-20 02:35:28 76

原创 LeetCode 865 Smallest Subtree with all the Deepest Nodes

LeetCode 865这个题目其实就是要求出最大长度的公共parent。 一种方法就是通过递归来找,先从root开始,如果他的左边的高度和右边的高度是一样的,那么最长的paths,分在了左右两边,那么共同节点就是root自己。如果不是,那么就向高的一遍查找。因为我们要计算数的高度,这里可以稍微做一个优化就是已经计算过的,我们都可以记住,下次直接使用。 def subtreeWithA...

2020-04-19 13:04:10 96

原创 LeetCode 822 card-flipping-game

LeetCode 822感觉这个题目不是很好,本来很容易的题目,但是题目确实说的不是很清晰。要求的其实就是最小的一张牌,并且本身正反不能一样,同时不能和正反一样的牌同数(这样反转的时候总是可以找到一个不会冲突的) def flipgame(self, fronts: List[int], backs: List[int]) -> int: same = {x fo...

2020-04-19 11:30:04 121

原创 LeetCode 64 minimum-path-sum

LeetCode 64对于每个位置,进入这个位置只有两种选择,从左边或者从上边,如果我们知道左边或者上边的值,就可以min(左边,上边)+自己的value。根据这个其实还是比较容易写递归的。如果不用递归,我们可以用DP def minPathSum(self, grid: List[List[int]]) -> int: try: m =...

2020-04-19 00:52:41 81

原创 LeetCode 1004 max-consecutive-ones-iii

LeetCode 1004运行转换k个0为1, 那么我们可以尝试维护一个k个0的sliding window,然后慢慢向数组后端移动,找到最长的子串。 def longestOnes(self, A: List[int], K: int) -> int: if K < 0: raise Exception("invalid input") if...

2020-04-19 00:47:26 115

原创 LeetCode 200 number-of-islands

LeetCode 200这个题目可以用dfs,bfs,或者union finder,还是比较直接的,只要把所有链接的都走玩就可以了。下面实现的用了额外的内存,实际上也可以直接修改数组本身改成另外一个值,这样可以节省空间,主要看是否允许改变原来的数组。 def numIslands(self, grid: List[List[str]]) -> int: if gr...

2020-04-18 07:44:47 138

原创 LeetCode 698 partition-to-k-equal-sum-subsets

LeetCode 698没有想到非常好的方法,用的是递归搜索,把所有的可能过一遍。稍微优化了几个地方,先查一下是否可能分(分成k份余数是0)然后先排序,如果加入当前值大于avg,那么不需要继续了。 def canPartitionKSubsets(self, nums: List[int], k: int) -> bool: if (nums == None o...

2020-04-18 05:32:28 80

原创 LeetCode 11 container-with-most-water

LeetCode 11要找到可能包含最多水的container,一个方法就是把所有的container都求一遍,然后算最大值,那么就是O(n^2).这个方法显然效率不高,所以需要考虑优化的方法。这个container的体积等于底的长度*高度,最长的底的长度就是n,如果我们先算最长底的container的体积,之后向里面收缩,那么底的长度就是一直变小的,一定要求高度更高才可能比这个大。使用这...

2020-04-18 05:04:33 112

原创 LeetCode 738 monotone-increasing-digits

LeetCode 738要求的这个数,从前向后都是递增的(不小于)<= N中最大的我们考虑332 这个case,因为要求最大,我们需要尽可能的保持高位,最高位是3,这个不成立最高位是2,那么后续我们都可以填写成最大的数。再举个例子,2419,最高位2,由于小于后面的4,可以保留4由于大于1,没法保留,只能改成3, 一旦做了这个修改,后面的位数都是可以修改成9的。总结一下,...

2020-04-18 04:53:41 85

原创 LeetCode 543 diameter-of-binary-tree

LeetCode 543需要求的是: The diameter of a binary tree is the length of the longest path between any two nodes in a tree. This path may or may not pass through the root.那么经过某个点的最长路径可以是,他的左边到自己的最长路径(左高度 -1...

2020-04-18 04:18:52 90

原创 LeetCode 17

LeetCode 17用dfs的方式遍历所有可能 def letterCombinations(self, digits: str) -> List[str]: d = collections.defaultdict(list) d['2'] = ['a', 'b', 'c'] d['3'] = ['d', 'e', 'f'] ...

2020-04-17 07:26:51 86

原创 LeetCode 876 middle-of-the-linked-list

LeetCode 876最简单的方法就是先遍历一遍,求出长度n,然后取 (n+1)/2, 从前到后在做半个遍历找到对应的指针。还有一个方法就是做快慢指针,快指针每次前进两格,慢指针每次前进一格,快指针到尾部的时候,慢指针应该在一半的位置。 def middleNode(self, head: ListNode) -> ListNode: if head == No...

2020-04-17 07:16:07 98

原创 LeetCode 56 merge-intervals

LeetCode 56需要merge的两个interval应该是有重合的部分,也就是所有a的last要大于b的start。考虑我们先根据start先排序,那么就只要看当前的这个interval的last是否大于下一个interval的start。 def merge(self, intervals: List[List[int]]) -> List[List[int]]: ...

2020-04-17 06:57:15 208

原创 LeetCode 1358

LeetCode 1358Brute Force的方法就是把所有长度大于等于3的字串找出来,然后看一下是否包含abc。这样效率不高。使用前后两个指针的方法,前指针向前走,如果前后指针中间包括了abc,那么所有前指针后面的字符加进来都是包括abc的,那么我们加上这些统计数字。然后后面的指针也向前挪,挪动之后如果发现有不全包括abc了,那么就继续挪动前指针,一直到满足条件。 def nu...

2020-04-17 06:48:40 81

原创 LeetCode 53 maximum-subarray

LeetCode 53关键点就是,其实只要当前和 >0我们就可以继续加。 def maxSubArray(self, nums: List[int]) -> int: if nums == None: raise Exception("invalid input: nums") maxSum = nums[0] tempSum...

2020-04-17 06:29:34 60

原创 LeetCode 1263 minimum-moves-to-move-a-box-to-their-target-location

LeetCode 1263这个题目基本上用的就是最之间的方法。首先考虑箱子是否能reach到终点,如果不能那么就是-1,再次考虑在推箱子的过程中,人必须能够到达去推的位置这两个都是可以用BFS来搜索的 def minPushBox(self, grid: List[List[str]]) -> int: direct = [[0, 1, 0, -1, 0], ...

2020-04-17 06:00:23 402

原创 LeetCode 214 shortest-palindrome

LeetCode 214虽然求的是最短的palindrome,其实题目可以转换为求从首字母开始的最长palindrome,然后反向添加剩余字符串。那么简单的实现就是: def shortestPalindrome2(self, s: str) -> str: #time out version if self.isPalindrome(s, len...

2020-04-17 05:11:29 109

原创 LeetCode 678 Valid Parenthesis string

LeetCode 678这个题目看起来不难,但是实际上我觉得还是挺容易错的。看到parenthesis的validation题目,自然想到的是stack,如果没有 * ,每次看到(就push进去,看到)就pop,最后是空就对了。但是有了*,可以任意替换,一种方法就是*单独存一个stack,遇到)的时候,先pop (的stack,没有的话pop *的stack。方法上基本上正确,第一遍写的时...

2020-04-17 04:49:16 103

原创 LeetCode 789 escape-the-ghosts

LeetCode 789这个题目我其实不太喜欢,说了一大堆,感觉其实没有真正的把问题说的很清楚。是否可以逃脱感觉是可以基于ghost的策略的,感觉不知道如何入手。最后看了一下其他人的讨论,才真正理解了这个问题。其实就是求曼哈顿距离,如果ghost比你先到target,那么它可以留在那里,就永远都没有机会到到target了。 def escapeGhosts(self, ghosts...

2020-04-16 11:13:41 77

原创 LeetCode 817 linked-list-components

LeetCode 817第一思路是把链表的关系转换存到dictionary,然后遍历数组,然后查dictionary,找到对于的前面的节点,合并集合。 def numComponents2(self, head: ListNode, G: List[int]) -> int: if head == None: return len(G) p = d...

2020-04-16 10:58:55 64

原创 LeetCode 825 friends-of-appropriate-ages

LeetCode 825仔细分析一下条件:age[B] <= 0.5 * age[A] + 7age[B] > age[A]age[B] > 100 && age[A] < 100第三个条件其实是无效的,因为第二个已经涵盖了,组合一下条件,其实就是要求 0.5*age【A】+7 < age【B】<agent[A]那么就可以转换为查找...

2020-04-16 10:32:10 69

空空如也

空空如也

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

TA关注的人

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