![](https://img-blog.csdnimg.cn/20190901212910729.jpg?x-oss-process=image/resize,m_fixed,h_224,w_224)
leetcode
专业刷leetcode,只用go语言
Ethan3014
头发多睡眠足有妹子的程序员
展开
-
207. 课程表
描述你这个学期必须选修 numCourse 门课程,记为 0 到 numCourse-1 。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们:[0,1]给定课程总量以及它们的先决条件,请你判断是否可能完成所有课程的学习?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/course-schedule著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。solutio原创 2020-12-19 13:38:03 · 103 阅读 · 1 评论 -
201. 数字范围按位与
链接题目.难度:middle解答:暴力解法肯定是不对的,考虑到数字的循环性,一圈以后就是重复计算了func rangeBitwiseAnd(m int, n int) int { if m == n || m == 0 { return m } round := 1 for i := 1; i <= 32; i++ { round <<= 1 i...原创 2020-04-19 22:20:23 · 128 阅读 · 0 评论 -
174. 地下城游戏
链接题目.难度:high解答:这道题其实不难,dp是一定的,关键是dp是从左上角递推呢还是目的地右下角递推。左上角递推涉及到某个位置的余额问题,一个dp搞不定,所以从右下角逆推。代码写的冗余了一点,不过思路清晰。package mainimport "fmt"func calculateMinimumHP(dungeon [][]int) int { h := len(dun...原创 2020-03-15 22:49:28 · 119 阅读 · 0 评论 -
164. 最大间距
链接题目.难度:high解答:对于整数型的排序问题,首先应该联想到桶排序,这是唯一On的排序算法。另外假设我们把n个数放在n+1个桶里面,必定有空桶产生,那么最大间距肯定在间隔了空桶的两个桶之间产生package mainimport "fmt"type bucket struct { min, max int}func maximumGap(nums []int) i...原创 2020-03-01 20:20:32 · 102 阅读 · 0 评论 -
162. 寻找峰值
链接题目.难度:middle解答:如果不是要求logn,还真想不到要用二分查找法。二分查找法的精髓在于每次排除一半的元素。我们保证在start和end之间一定存在一个峰值就行了,保证的方法是start是上升的,end是下降的。package mainimport "fmt"func findPeakElement(nums []int) int { if len(nums) ...原创 2020-03-01 19:09:17 · 80 阅读 · 0 评论 -
154. 寻找旋转排序数组中的最小值 II
链接题目.难度:high解答:思路还是二分法的思路,但是因为允许存在重复的元素,所以当mid的元素跟start和end相等的时候,其实判断不出来mid元素是属于左边还是右边的,所以这时候直接简单的start++,因为这个操作总是安全的。其他情况我们每次排除大概1/2的数据package mainimport "fmt"func findMin(nums []int) int {...原创 2020-02-23 21:41:20 · 88 阅读 · 0 评论 -
152. 乘积最大子序列
链接题目.难度:middle解答:这个与最大子序列和是一样的,维护两个dp,表示以i结尾的最大乘积和最小乘积。优化:由于当前的值的计算只依赖上一个的结果dp数组可以优化为dp变量package mainimport "fmt"func maxProduct(nums []int) int { dpMax := make([]int, len(nums)) dpMin :=...原创 2020-02-18 21:45:22 · 80 阅读 · 0 评论 -
牛客网:最大点集合
链接难度:high解答:先对x降序,那么后面的点的y如果小于前面任意点的y,则必不符合条件,同时,如果前面的所有点的y都比它小,那么他一定满足条件。当x相等的时候,特殊处理。package mainimport ( "bufio" "fmt" "os" "sort" "strconv" "strings")type point struct { x, y int...原创 2020-02-09 19:50:40 · 438 阅读 · 0 评论 -
二叉树的前序遍历144后序遍历145-迭代方式
链接题目.题目.难度:middle解答:看注释。其实递归就是自己用一个stack模拟递归使用的函数栈package maintype TreeNode struct { Val int Left *TreeNode Right *TreeNode}func preorderTraversal(root *TreeNode) []int { vals := ma...原创 2020-02-08 17:26:52 · 66 阅读 · 0 评论 -
143. 重排链表
链接题目.难度:middle解答:常规操作,链表的插入和翻转package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func printList(root *ListNode) { num := 0 for root != nil { fmt.Printf("->%d"...原创 2020-02-08 17:09:00 · 79 阅读 · 0 评论 -
142. Linked List Cycle II
链接题目.难度:middle解答:经典的链表环求环入点的问题,最关键的是找到环。最骚的环节是,为什么从环的入口和第一次meet的点同时出发再次相遇的时候会是环的入口。package mainimport ( "fmt")type ListNode struct { Val int Next *ListNode}func detectCycle(head *Lis...原创 2020-02-08 16:48:07 · 82 阅读 · 0 评论 -
牛客网;最长的可整合子数组的长度
链接题目.难度:high解答:dp[i]表示以s[i]为结尾的字符串的最长可整合字符串。在这里我们用seg来表示有多少个段,其实还可以更简单,判断在m里面的max - min + 1 == len(m)此时就是满足条件的package mainimport ( "bufio" "fmt" "os" "strconv" "strings")func convInts(...原创 2020-02-05 19:24:55 · 267 阅读 · 0 评论 -
139. 单词拆分
链接题目.难度:high解答:用递归是最简单的,可惜会超时。一般来说递归超时了,就尝试用dp吧,这两者简直亲兄弟package mainimport "fmt"import "strings"func wordBreak1(s string, wordDict []string) bool { if len(s) == 0 { return true } for...原创 2020-02-05 17:23:47 · 111 阅读 · 0 评论 -
牛客网 雀魂启动
package mainimport ( "bufio" "fmt" "os" "strconv" "strings")func convInts(ss []string) []int { result := make([]int, len(ss)) for i, v := range ss { res, err := strconv.ParseInt(v, 10, 6...原创 2020-02-04 21:23:33 · 302 阅读 · 0 评论 -
[牛客网] 万万没想到之聪明的编辑
package mainimport ( "bufio" "fmt" "os" "strconv" "strings")func convInts(ss []string) []int { result := make([]int, len(ss)) for i, v := range ss { res, err := strconv.ParseInt(v, 10, 6...原创 2020-02-04 20:04:43 · 541 阅读 · 0 评论 -
牛客:[编程题]万万没想到之抓捕孔连顺
链接木有,全部贴上来不大好吧难度:middle解答:拿到题不慌,首先分析这是干啥的。其实就是个组合问题,现在问题的关键就是找准组合的起始地址。虽然是嵌套循环,但是每个元素只是被i或者j遍历2次,所以复杂度还是npackage mainimport ( "bufio" "fmt" "os" "strconv" "strings")func convInts(ss []...原创 2020-02-04 19:49:28 · 492 阅读 · 0 评论 -
137. 只出现一次的数字 II
链接题目.难度:high解答:我们可以统计每一个bit上的0或者1出现的次数。这样的话其实可以把3换成n。虽然有更牛逼的异或来模拟三进制解决,但是我觉得不够通用不够好理解。package mainimport "fmt"func singleNumber(nums []int) int { result := 0 for i := uint(0); i < 32; i...原创 2020-02-04 15:03:48 · 78 阅读 · 0 评论 -
135. 分发糖果
链接题目.难度:high解答:其实就是求每个数左边或者右边连续小于自己的个数。感觉不是很难啊。package mainimport "fmt"func candy(ratings []int) int { if len(ratings) <= 1 { return len(ratings) } candies := make([]int, len(rating...原创 2020-02-03 14:16:26 · 133 阅读 · 0 评论 -
134. 加油站
链接题目.难度:middle解答:这道题要求环形之中任意两点能否到达,我们可以把环形拉平,数据拉长一倍就能覆盖到所有的情况。所以问题变成了,从a点出发至b点,中间任意一点的剩余油量都是大于等于0,求ab两点之间的最大距离。其实上ab两点可以看做一个window,变成了滑动窗口问题。既然是滑动窗口,那么窗口的伸缩逻辑就成为主要算法了。对于ab窗口,如果长度等于len(gas)那么就已经找到...原创 2020-02-03 13:56:49 · 75 阅读 · 0 评论 -
132. 分割回文串 II
链接题目.难度:high解答:dp用来表示前n个字符串最小需要多少次cut。另外先计算好各个子字符串是否是回文.之前想到过一个dp[i][j]表示是s[i:j+1]最少需要多少次切割。这个思路是对的,但是复杂度变为n**3了,没有利用到最后一次右边的字符串一定是回文的特性。package mainimport "fmt"func minCut(s string) int { ...原创 2020-02-01 21:45:06 · 94 阅读 · 0 评论 -
131. 分割回文串
链接题目.难度:middle,但我觉得是high解答:这个题咋一看思路很好找,可以用动态规划,计算前n-1长度的子串,然后递推n长度的结果。可是dp一般不适用与这种需要中间结果的,会浪费大量空间。所以用dfs。package mainimport "fmt"type TreeNode struct { Val int Left *TreeNode Right *Tr...原创 2020-02-01 19:43:37 · 93 阅读 · 0 评论 -
128. 最长连续序列
链接题目.难度:high解答:这个问题没有用到高深的算法,就是对map的应用。算法里,map里面的每个元素只会被标记一次,虽然是嵌套循环,其实最终的复杂度还是线性的package mainimport "fmt"func longestConsecutive(nums []int) int { if len(nums) <= 1 { return len(nums)...原创 2020-02-01 18:15:12 · 53 阅读 · 0 评论 -
126. 单词接龙 II
链接题目.难度:high解答:这其实就是图的算法,Dijkstra算法这道题,先求直达的最小路径,这个用bfs没啥好说的,一般求路径的问题就是要用dfs,可是不需要求所有的到达路径,也不需要求随意的一条到达路径,不然dfs准没错。所以我们还是要用bfs,不过在bfs的时候,把经过的所有节点都求出从开始到他这儿的路径,看起来好像很浪费空间,不过就这样做确实可以达到目的,不然重构路径确实很...原创 2020-02-01 01:11:59 · 154 阅读 · 0 评论 -
124. 二叉树中的最大路径和
链接题目.难度:high解答:这道题可以分解为子问题:以root开始的路径最大路径和是多少,及较容易想到的是先计算每一个节点开始的最大路径和,那么就需要一个map来保存临时的结果。难的是想到直接在计算路径和的过程中就算出了最终结果package mainimport "fmt"type TreeNode struct { Val int Left *TreeNode...原创 2020-01-31 21:49:15 · 59 阅读 · 0 评论 -
123. 买卖股票的最佳时机 III
链接题目.难度:high解答:这道题我们可以拆开来看,如果只允许买卖一次,那么很简单了,所以我们可以简化为另外一个问题,分别求出在[0:i]以及[i+1:]这两个数组里分别买卖一次。package mainimport "fmt"func maxProfit(prices []int) int { if len(prices) <= 1 { return 0 }...原创 2020-01-30 17:59:26 · 97 阅读 · 0 评论 -
120. 三角形最小路径和
链接题目.难度:middle解答:这道题其实是一个典型的dp问题,下一层的路径和最小值要依赖上一层的路径和最小值,既可以由上到下又可以由下至上。但是这里我们只需要依赖上一层的数据,所以空间复杂度可以优化为只需要一层的数据缓存。如果可以修改原来的数据,那么不需要额外空间。package mainimport "fmt"func minimumTotal(triangle [][]...原创 2020-01-30 16:27:19 · 78 阅读 · 0 评论 -
115. 不同的子序列
链接题目.难度:high解答:dp用熟了反而觉得简单了。s字符串增加一个字符,要么这个字符与t的最后一个字符相同,要么不相同package mainimport "fmt"func numDistinct(s string, t string) int { if len(s) < len(t) { return 0 } if len(t) == 0 { r...原创 2020-01-29 14:25:15 · 109 阅读 · 0 评论 -
99. 恢复二叉搜索树
链接题目.难度:high解答:morris遍历就是利用左子树的最右节点指向当前的节点,这样就可以直接使用 rightMost.Right访问到下一个元素,这样就实现了遍历。morris遍历空间复杂度是O1,但是时间复杂度是N*logN,算下来并不划算,只是作为一种解法而存在。现在二叉树的遍历就有了三种方法:1,递归;2,迭代;3,Morris遍历func recoverTree(roo...原创 2020-01-28 15:50:38 · 100 阅读 · 0 评论 -
97. 交错字符串
链接题目.难度:high解答:字符串相关的,咱首先想到的就是dp,这道题也很典型,递推逻辑是这样的:s1[:i] 和s2[:j]是否可以成为s2[i+j-1]的交错字符串。package mainimport ( "fmt")func isInterleave(s1 string, s2 string, s3 string) bool { if len(s1)+len(s...原创 2020-01-28 14:54:14 · 104 阅读 · 0 评论 -
96. 不同的二叉搜索树
链接题目.难度:middle解答:tree的定义就是递归的,所以关于树的算法也多采用递归。但是这个递归的话存在子问题重复计算的问题,所以用dp更好package mainimport ( "fmt")type TreeNode struct { Val int Left *TreeNode Right *TreeNode}func printTree(ro...原创 2020-01-27 14:55:17 · 399 阅读 · 0 评论 -
95. 不同的二叉搜索树 II
链接题目.难度:middle解答:tree的定义就是递归的,所以关于树的算法也多采用递归。我们可以先选择一个root,然后确定左右子树,再递归的创建左右子树package mainimport ( "fmt")type TreeNode struct { Val int Left *TreeNode Right *TreeNode}func printTr...原创 2020-01-27 14:41:59 · 97 阅读 · 0 评论 -
94. 二叉树的中序遍历
链接题目.难度:middle解答:二叉树的三种遍历。除了用递归以外还可以用一个栈,也就是迭代的方式来遍历。如果是前序遍历就在入栈的时候处理元素。package mainimport ( "fmt")type TreeNode struct { Val int Left *TreeNode Right *TreeNode}func printTree(roo...原创 2020-01-26 17:00:30 · 149 阅读 · 0 评论 -
92. 反转链表 II
链接题目.难度:middle解答:就是链表的前插入和尾插入,以及拼接package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func printList(root *ListNode) { num := 0 for root != nil { fmt.Printf("->...原创 2020-01-26 16:11:11 · 103 阅读 · 0 评论 -
91. 解码方法
链接题目.难度:middle解答:dp大法好啊,最好是推导子公式package mainimport "fmt"func numDecodings(s string) int { if len(s) == 0 { return 0 } if s[0] > '9' || s[0] <= '0' { return 0 } dp := make([]...原创 2020-01-25 14:03:39 · 298 阅读 · 0 评论 -
89. 格雷编码
链接题目.难度:middle解答:最重要的是想到分成子问题,由n-1的结果推导n的结果,结社n-1的a1…an-1是有序的,那么n的解决方案就是a1…an-1 + 1an-1…1a1package mainimport "fmt"func grayCode(n int) []int { if n == 0 { return []int{0} } result := ...原创 2020-01-25 13:37:59 · 1409 阅读 · 0 评论 -
87. 扰乱字符串
链接题目.难度:high解答:这题顺着题目的意思做就是递归,但是分析一下递归的时间复杂度,基本上是阶乘或者指数级别的,仔细思考一下,发现存在重复计算的子问题。所以考虑动态规划。dp最重要的就是递推公式。我们可以设置一个变量s(i,j,k)用来表示s1[i], s2[j]处开始,并且长度为k的字符串是不是扰乱字符串。package mainimport "fmt"func isS...原创 2020-01-18 22:00:54 · 94 阅读 · 0 评论 -
86. 分隔链表
链接题目.难度:middle解答:就是常规的连表增减元素而已package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func printList(root *ListNode) { num := 0 for root != nil { fmt.Printf("->%d"...原创 2020-01-18 19:29:48 · 147 阅读 · 0 评论 -
85. 最大矩形
链接题目.难度:high解答:这道题最难的就是想到要用柱状图的最大矩形面积来计算,从而把复杂度降低到n*npackage mainimport "fmt"func largestRectangleArea(heights []int) int { if len(heights) == 0 { return 0 } if len(heights) == 1 { r...原创 2020-01-11 14:51:42 · 106 阅读 · 0 评论 -
84. 柱状图中最大的矩形
链接题目.难度:high解答:像这种数据,矩形面积还有接雨水什么的,一般都是用递增栈或者递减栈来实现。对这道题,当左边的元素全部都大于当前元素的时候,说明整个左边的元素都是可以利用的package mainimport "fmt"func largestRectangleArea(heights []int) int { if len(heights) == 0 { r...原创 2020-01-11 14:02:16 · 96 阅读 · 0 评论 -
82. 删除排序链表中的重复元素 II
链接题目.难度:middle解答:链表常规玩法。用一个dummyHead好办一些package mainimport ( "fmt")type ListNode struct { Val int Next *ListNode}func printList(root *ListNode) { num := 0 for root != nil { fmt....原创 2020-01-04 14:47:34 · 94 阅读 · 0 评论