化工热力学补考成功,几天没有头脑了,赶紧赏自己几题Leetcode动态规划算法最长系列
@Author:Runsen
@Date:2020/10/9
“恭喜你昨天,化工熱力學補考成功!”
“區區化工熱力學還想讓我重修,只不過浪費了我九月一半的精力和十月的九成精力,補考其實是慶祝你可以畢業而已。”
還有10/15號的化工原理補考,給我再來一次翻身的感受?
必須的,但是為了補考,錯過了校招。我真的好點慌。
那趕緊趁著這幾天刷下Leetcode恢復下Feel,剩下幾天給我死命復習化工原理。
那必須的,從十月,我就沒有寫博客,沒有刷Leetcode,人生就像沒有了精彩。
那沒辦法,補考事重于泰山,你不能跟畢業證開玩笑。
動態規劃算法最長系列,可以說是dp的重點,竟然我這么想死,那我就開始搞殘我的大腦。
Leetcode5、 最長回文子串
Leetcode第五題、 最長回文子串,方法動態規劃和中心擴展,有沒有印象?
動態規劃:dp[i][j] = (dp[i + 1][j - 1] and s[i] == s[j])
i表示回文左邊的index,j表示回文右邊的index,需要判斷dp[i + 1][j - 1]是不是回文,而且要求 s[i] == s[j],那么dp[i][j]就是回文。
class Solution(object):def longestPalindrome(self, s):""":type s: str:rtype: str"""len_s = len(s)if len_s < 2:return s# 因為是判斷子串,根據子串的性質s[i:j],因此必然涉及到兩層循環,也就需要定義二維數組dp# 狀態初始化:默認為True,可以省去很多計算dp = [[True for _ in range(len_s)] for _ in range(len_s)]max_len = 0start = 0# 狀態轉移方程:表示i到j的子串是否是回文子串# dp[i][j] = (s[i] == s[j] and dp[i+1][j-1])# 遍歷狀態集:因為需要知道j-1,因此j需要從1開始for j in range(1, len_s):# 因為是子串,i一定是要小于jfor i in range(j):if s[i] == s[j]:# 如果頭尾字符相等,那么直接正負取決于之前的子串dp[i][j] = dp[i+1][j-1]else:# 如果不相等,不管子串如何,肯定不是回文dp[i][j] = False# 更新最大長度if dp[i][j] and max_len < j - i:max_len = j - istart = ireturn s[start:start+max_len+1]還有一個方法是中心擴散的,注意s[l + 1:r]返回的位置。
def helper(s, l, r):# 中心擴散while l >= 0 and r < len(s) and s[l] == s[r]:l -= 1r += 1return s[l + 1:r] res = "" for i in range(len(s)):# 奇數形回文, like "aba"tmp = helper(s, i, i)if len(tmp) > len(res):res = tmp# 偶數形回文, like "abba"tmp = helper(s, i, i + 1)if len(tmp) > len(res):res = tmp return res更多的查看大佬的題解
Leetcode300、最長上升子序列
''' @Author: Runsen @WeChat:RunsenLiu @微信公眾號: Python之王 @CSDN: https://blog.csdn.net/weixin_44510615 @Github: https://github.com/MaoliRUNsen @Date: 2020/10/9 ''' def lengthOfLIS(nums):# 如果定義dp dp[i] 最長上升子序列 那么 dp[i] = max(dp[i], dp[k] + 1) 0<k<i-1m = len(nums)if m <= 1:return mdp = [ 1 for _ in range(m)]for i in range(1,m):for j in range(i):if nums[i] > nums[j]:dp[i] = max(dp[i], dp[j]+ 1 )return max(dp) print(lengthOfLIS([1,3,6,7,9,4,10,5,6]))Leetcode674. 最長連續遞增序列
Leetcode300、最長上升子序列要求是不連續的,而Leetcode674. 最長連續遞增序列要求是連續的。
class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:"""動態規劃"""# n = len(nums)# if n == 0:# return 0# dp = [0] * n# dp[0] = 1# for i in range(1, n):# if nums[i] > nums[i-1]:# dp[i] = dp[i-1] + 1# else:# dp[i] = 1# return max(dp)"""遍歷一遍就解決問題"""n = len(nums)if n <= 1:return ncount = 1res = 1for i in range(1, n):if nums[i] > nums[i-1]:count += 1else:count = 1res = max(res, count)return resLintcode 397. 最長上升連續子序列
Lintcode 此題和Leetcode中的第674多了一個要求,認為(最長上升連續子序列可以定義為從右到左或從左到右的序列。)
其實就是求最長連續遞減序列。
class Solution:"""@param A: An array of Integer@return: an integer"""def longestIncreasingContinuousSubsequence(self, A):# write your code here# dp[i] = max(dp[i,dp[k]+ 1)m = len(A)if m <=1:return mdp1 = [1 for _ in range(m)]dp2 = [1 for _ in range(m)]for i in range(1,m):if A[i] > A[i-1]:dp1[i] =dp1[i-1]+ 1else:dp1[i] =1 if A[i] < A[i-1]:dp2[i] =dp2[i-1]+ 1else:dp2[i] =1 return max(max(dp1),max(dp2))總結
動態規劃算法最長序列其中在看于動態規劃的狀態轉移方程如何推導
現在大四了。大三結束后,那時的我還算壯志躊躇,我以為自己可以找到算法的實習,這是一條好路,我必須承認。校招方向只有Java,前端,C++和算法。但出于校招算法內積,沒有過人的項目,學歷專業的等我自身原因的考慮,我放棄了算法,決定把重心往前端靠靠,拿著一個不太好看的文憑,不太豐富的校內經歷,就下定決心在春招找實習。畢竟秋招我給補考耽誤了,我需要重新振作起來。
我已經看到了大四秋招的失敗,但我還是要厚臉皮去嘗試,我還有一些光陰,我曾經年輕過,也正在年輕著。
說完了激勵自己的話,那就繼續去面對生活吧。
總結
以上是生活随笔為你收集整理的化工热力学补考成功,几天没有头脑了,赶紧赏自己几题Leetcode动态规划算法最长系列的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 缘生源是什么公司
- 下一篇: 股票系列,动态规划,加油,九月太浪了,十