文章目录

  • LeetCode每日一题 golang
    • T15 2020.6.12 三数之和,双指针的运用
    • T70 2020.6.13 斐波那契数列
    • T1014 2020.6.17 最佳观光:双指针,计算公式转化,局部最大值的求解优化
    • T1028 2020.6.18 先序还原二叉树,遍历关系和左中右的关系
    • T125 2020.6.19 带杂字符的回文串
    • T10 2020.6.20 正则匹配,* . 字母
    • T124 2020.6.21 二叉树的最大路径和
    • T63 2020.7.6 不同的路径
    • T112 2020.7.7 找路径和为给定值
    • T2020.7.8 面试题 16.11 跳水板
      • T2020.7.12 174. 地下城游戏
      • 2020.7.14 T120 三角形最小路径和
      • 2020.7.15 T96 不同的二叉搜索树

LeetCode每日一题 golang

T15 2020.6.12 三数之和,双指针的运用

不重复问题—>排序,遇到相同值直接跳过
在排序数组中,Fix A, find B+C = -A的方式:双指针。
x1 < x2 < x3 < x4 < x5
求 xi + xj = -A的思路,双指针向内收缩,是可以遍历所有情况的。
理解方式:双指针是对暴力法的一个剪枝。
二、双指针法的应用
(1)和为sum的两个数
(2)判断链表是否有环
(3)奇偶排序
(4)求单链表的中间元素
(5)给出n个数,问最多能组成多少个三角形

T70 2020.6.13 斐波那契数列

爬楼梯,经典动态规划,斐波那契数列,可用三个变量节省空间,通用名:滚动数组。

T1014 2020.6.17 最佳观光:双指针,计算公式转化,局部最大值的求解优化

最佳观光组合。思路是先有O(n^2)的暴力搜索,结合朴素的观察,得到优化方法。

由于计算value的公式为A[i] + A[j] + i - j : ( i < j ),把ij归到一起后直觉上更利于思考。
变公式为(A[i] + i) + (A[j] - j) : ( i < j )

把示例给的数组[8,1,5,2,6]按照这个计算方式展开成两个数组。
(A[i]+i) 8 2 7 5 10
(A[j]-j) 8 0 3 -1 2

从上面找一个数,以及它右下方最大的数,相加,即为结果。比如8+0 8+3 8-1 8+2都是可行解,那么如何找到最大解?

我们不断推进j索引,例如推进到3这个位置,那么j=3时,最大值就是8,2中选一个最大值加上j=3的值。
可以得到一个思路,对j(下面的数组)进行遍历,同时更新i(上面的数组)数组到目前为止的最大值。即可得到每一个j对应的最大值。

T1028 2020.6.18 先序还原二叉树,遍历关系和左中右的关系

从先序遍历还原二叉树。 同时限定了如果节点只有一个子节点,那么保证该子节点为左子节点
先序遍历的特征:根左右。那么遍历一个数组 A1 A2 A3 A4…,每遍历到一个,要么是前一个的左节点(上述加粗的限定,不可能出现左空右非空),要么是之前遍历过的某个的右节点。

拿到题目,比较懵,还是对树结构不太熟悉。

这题的核心思维是维护一个栈,给栈顶元素找子节点。

T125 2020.6.19 带杂字符的回文串

验证回文串。
比较简单,遇到不相干的字符跳过就行,双指针相遇法。

T10 2020.6.20 正则匹配,* . 字母

正则匹配。难。
dp方法,s[i][j] 表示pattern[1, j] 和 string[1, i]是否匹配。
递推式比较复杂,第一层是区分 * 和 非 。第二层找到x的递推式。

 // f[i][j]// p[j] != "*" : if p[j] == s[i] { f[i][j] = f[i-1][j-1] } else { f[i][j] = false }// p[j] == "*" : if p[j-1] == s[i] { f[i][j] = f[i-1][j] or f[i][j-2] } else { f[i][j] = f[i][j-2] }

T124 2020.6.21 二叉树的最大路径和

主要思路:树的递归。
对于一个节点来说,最大路径存在的地方: 左+中+右,或者根+右边最大值,或者根+左边最大值。
对于上面的节点的贡献,相当于左+中 或者 右+中。
需要注意的是节点值可小于0,计算某个根节点的左边最大,需要考虑与0比较。

树的递归,通用思考方式:
本层能(依赖左右节点)得到什么(可行解),本层需要(给上层提供什么结果)。

T63 2020.7.6 不同的路径

由于限定只能向右和下走,所以dp可以很容易的写出来。dp[i][j] = dp[i-1][j]+dp[i][j-1]。没什么难度。

T112 2020.7.7 找路径和为给定值

二叉树的递归,每次用sum减去node.Val作为子树的入参。

T2020.7.8 面试题 16.11 跳水板

因为一共用k个,所以很容易想到遍历i,取ilongerk-ishorter
又要求没有重复且递增,麻烦在于去重,但是算几个数发现不会有重复的,因为如果shorter < longer
那么对于给定k,对于 j > i(k-j)*shorter+longer*j - [(k-i)*shorter+longer*i] = (j-i)*(longer-shorter) 由于 longer > shorterj > i,一定大于0,所以必定是递增的且不相等。所以不需要去重,且一定单调递增。同时可以发现,如果longer == shorter则上面的差分式子等于0,这就是说所有的值都是相等的,只需要返回一个数即可。

func divingBoard(shorter int, longer int, k int) []int {if k == 0{return nil}if shorter == longer{return []int{shorter*k}}m := make([]int, k+1)for i:=0;i<=k;i++{m[i] = (k-i)*shorter + longer*i}return m
}

T2020.7.12 174. 地下城游戏

左上到右下的DP,不满足组“无后效性”

  1. 重叠子问题
  2. 最优子结构
  3. 无后效性 不满足?

右下到坐上的DP,满足DP。
dp[i][j] 表示从i,j开始走,能够到达终点的所需的最低初始健康点数。
dp[i][j] 最少要1点。并且+dungeon[i][j](补过i,j点的血或者扣掉i,j点的伤害)后是(右和下之间的最小值)就够了。例如右需要5点,下需要6点,那么本点+dungeon[i][j] == 5从右边走。
dp[i][j]=max(min(dp[i+1][j],dp[i][j+1])−dungeon(i,j),1)

dp[m][…] = +inf // 表示不能往下走
dp[…][n] = +inf // 表示不能往右走
dp[m-1][n] = 1 // 最后剩1点,最后一步是m-1,n-1向下,或者向右,他们的值均设置为1即可保证在m-1,n-1扣完血大于1点。
dp[m][n-1] = 1 // 最后剩1点

for i := m - 1; i >=0; i-- {for j := n - 1; j >= 0; j-- {dp[i][j] = max(min(dp[i+1][j], dp[i][j+1]) − dungeon(i,j), 1)}
}

代码:

func calculateMinimumHP(dungeon [][]int) int {// 开始补全代码max := func(a,b int)int{if a > b {return a}return b}min := func(a,b int)int{if a < b {return a}return b}m, n := len(dungeon), len(dungeon[0])dp := make([][]int, m+1, m+1)for i := 0; i <= m; i++ {dp[i] = make([]int, n+1, n+1)if i == m {for j := 0; j <= n; j++{dp[i][j] = math.MaxInt32}}dp[i][n] = math.MaxInt32}dp[m-1][n], dp[m][n-1] = 1, 1for i := m - 1; i >=0; i-- {for j := n - 1; j >= 0; j-- {dp[i][j] = max(min(dp[i+1][j], dp[i][j+1])-dungeon[i][j], 1)}} return dp[0][0]
}

2020.7.14 T120 三角形最小路径和

从上到下的DP,每一层只能由左上那个点而来。
这是一个内存优化的代码,不优化之前需要n*n的空间。优化后,从上往下,从右往左算,可以复用一部分空间,(每层计算的每个元素只和f[上一层][x]f[上一层][x-1]有关,所以从右往左算)

func minimumTotal(triangle [][]int) int {n := len(triangle)f := make([]int, n)f[0] = triangle[0][0]for i := 1; i < n; i++ {f[i] = f[i - 1] + triangle[i][i] // 特殊情况 最右边的点,只能由左上得到for j := i - 1; j > 0; j-- { // 每一行 从右到左计算, f[x] 利用 f[x-1],所以必须从右到左f[j] = min(f[j - 1], f[j]) + triangle[i][j]// 走到i,j只能由左上(i-1,j-1)或 上(i-1, j)// min(左上, 上) + 这个点的值 更新到 f[这个点]}f[0] += triangle[i][0] // 特殊情况,最左的点,只有由上得到}ans := math.MaxInt32for i := 0; i < n; i++ {ans = min(ans, f[i])}return ans
}func min(x, y int) int {if x < y {return x}return y
}

2020.7.15 T96 不同的二叉搜索树

这是一题卡塔兰数的问题。
借助递推式,逐层把计算写出来就可以找到规律。

func numTrees(n int) int {// 1为根,左,右,2为根...// G(n) 表示1...n组成的二叉搜素树种类// F(i, n)表示i为根,n为层数的二叉树// G(n) = Sum for i∈[1,n](F(i, n))// G(n-i) = 右边组合数,和具体数无关!!// F(i, n)怎么算? 左边组合数 * 右边组合数 = G(i-1) * G(n-i)// 故 G(n) = 求和 j∈[1,n] ( G(j-1) * G(n-j) )// 边界:G(0) = G(1) = 1// G(2) = G(0)*G(1) + G(1)*G(0)// G(3) = G(0)*G(2) + G(1)*G(1) + G(2)*G(0)// G(4) = G(0)*G(3) + G(1)*G(2) + G(2)*G(1) + G(3)*G(0)// ...G := make([]int, n + 1)G[0], G[1] = 1, 1for i := 2; i <= n; i++ {for j := 1; j <= i; j++ {G[i] += G[j-1] * G[i-j]}}return G[n]
}

Leetcode每日一题——思路小记相关推荐

  1. Leetcode每日一题:171.excel-sheet-column-number(Excel表列序号)

    思路:就是168题的反命题,进制的方式完美解决: Leetcode每日一题:168.excel-sheet-column-title(Excel表名称) class Solution {public: ...

  2. LeetCode每日一题——1812. 判断国际象棋棋盘中一个格子的颜色

    LeetCode每日一题系列 题目:1812. 判断国际象棋棋盘中一个格子的颜色 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个坐标 coordinates ...

  3. 【LeetCode每日一题】——109.有序链表转换二叉搜索树

    文章目录 一[题目类别] 二[题目难度] 三[题目编号] 四[题目描述] 五[题目示例] 六[题目提示] 七[解题思路] 八[时间频度] 九[代码实现] 十[提交结果] 一[题目类别] 二叉树 二[题 ...

  4. leetcode每日一题·救生艇问题(Python)

    leetcode每日一题·救生艇问题(Python) 问题描述 题目入口 题目思路 首先分析问题,一个船最多坐两人,因此我们可以把这个问题看作两两组合的问题,并且如果最重的那个人和最轻的人加起来大于l ...

  5. LeetCode每日一题——904. 水果成篮

    LeetCode每日一题系列 题目:904. 水果成篮 难度:普通 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 你正在探访一家农场,农场从左到右种植了一排果树.这些树用一个整 ...

  6. LeetCode每日一题——1758. 生成交替二进制字符串的最少操作数

    LeetCode每日一题系列 题目:1758. 生成交替二进制字符串的最少操作数 难度:简单 文章目录 LeetCode每日一题系列 题目 示例 思路 题解 题目 给你一个仅由字符 '0' 和 '1' ...

  7. Leetcode 每日一题双题版(2.25+2.24)模拟练细节

    Leetcode 每日一题双题版(2.25+2.24)模拟练细节 前言 刚刚敲了今天刷新的题目,然后昨天的也写了,就想着更新一下blog 两道题都是模拟题,对于模拟,我的看法就是看懂题目,拿捏细节,难 ...

  8. 【Leetcode 每日一题】514. 自由之路(BFS+优先队列)

    Leetcode 每日一题 题目链接:514. 自由之路 难度: 困难 解题思路: 这道题乍一看,可以选择用动态规划或者BFS来求解.本文使用BFS来进行解答.注意到题中有一个最小的到路径.所以我们可 ...

  9. leetcode每日一题--前缀树;前缀哈希;深搜;面试题 08.04. 幂集;648. 单词替换面试题 01.09. 字符串轮转;剑指 Offer II 062. 实现前缀树

    leetcode每日一题 ps:今天的每日一题没意思,简单的模拟,自己换一道 面试题 08.04. 幂集 幂集.编写一种方法,返回某集合的所有子集.集合中不包含重复的元素. 说明:解集不能包含重复的子 ...

最新文章

  1. java删除不,Java文件不能删除,该怎么解决
  2. 深度学习: 从 RoIPooling 到 RoIAlign
  3. C++面试/技巧(四)
  4. 图像领域深度学习的七个境界
  5. SNMP简单网络管理协议
  6. (6)ISE14.7生成bit文件报错解决(FPGA不积跬步101)
  7. 木兰编程语言重现——支持列表操作,演示编辑器高亮
  8. 【比赛分享】互联网新闻情感分析复赛top8(8/2745)解决方案及总结
  9. 22-微信小程序商城 我的订单(微信小程序商城开发、小程序毕业设计、小程序源代码)(黄菊华-微信小程序开发教程)
  10. 畅视影院APP源码,电影网站app源码
  11. 计量论文stata代码大全
  12. com.android.dx.cf.iface.ParseException
  13. 联网时显示已连接无法连接到服务器怎么办,路由器显示已连接不可上网怎么办?...
  14. 【百度地图api】之获取当前用户地理位置-浏览器定位
  15. 蓝桥杯嵌入式定时器输出PWM(可调占空比)
  16. c语言规定 标识符由,C语言规定标识符只能由字母、数字和小数点三种字符组成。()...
  17. invalid button size rid: 5fd188c8-1d752f57-0d53f85f
  18. Android Studio 使用中 遇到的那些奇奇怪怪的问题
  19. 2016-12-26 菜鸟上路(4)——VS中关于MFC界面设计
  20. Java操作linux脚本

热门文章

  1. jQuery.validate使用手册,详解
  2. Hammer设置详解
  3. mysql性能视频教程_[视频教程] MySQL性能管理及架构设计 (完整版)
  4. 嵌入式 - 存储介质【2】ROM RAM这么简单就区分了
  5. 1240 -- 装礼物
  6. 上市公司重组与要约收购数据(2015-2021)
  7. java基础-java简介
  8. python对话机器人怎么搭建代码语言库_教你用python几十行代码编写对话机器人
  9. 告别被拒,如何提升iOS审核通过率(下篇)——应用内容检查大法与提审资源检查大法...
  10. 从胶鞋到国际潮牌 国产运动鞋走向世界