Leetcode每日一题——思路小记

文章目录

  • 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 跳水板

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
}

你可能感兴趣的:(LeetCode)