摘要:認(rèn)真做題的分割線第一題乘積最大子序列難度中等給定一個(gè)整數(shù)數(shù)組,找出一個(gè)序列中乘積最大的連續(xù)子序列該序列至少包含一個(gè)數(shù)。
寫(xiě)在前面的話
慢慢轉(zhuǎn)變思路,不再死磕不會(huì)做的題,思路可以先借鑒,但是一定要吃透透。
上周末看完看完了《算法圖解》,感覺(jué)對(duì)一些題目的思路有比較大的幫助,但是還是要在實(shí)踐中理解。
152. 乘積最大子序列
難度:中等
給定一個(gè)整數(shù)數(shù)組nums,找出一個(gè)序列中乘積最大的連續(xù)子序列(該序列至少包含一個(gè)數(shù))。
我的題解:
class Solution(object): def maxProduct(self, nums): """ :type nums: List[int] :rtype: int """ length = len(nums) maxsum = [0 for _ in range(length)] minsum = [0 for _ in range(length)] maxsum[0] = minsum[0] = nums[0] # 限定最大最小值 dp = nums[0] #當(dāng)前狀態(tài) for i in range(1,len(nums)): maxsum[i] = max(maxsum[i-1]*nums[i],minsum[i-1]*nums[i],nums[i]) minsum[i] = min(maxsum[i-1]*nums[i],minsum[i-1]*nums[i],nums[i]) dp = max(dp,maxsum[i]) return dp
我的思路:
這題做了兩次,主體思路為:每次都找到乘積中的最大正值和最小負(fù)值,因?yàn)榻^對(duì)值最大的兩個(gè)數(shù)在下一次計(jì)算中才有可能成為最大值。(畢竟題目沒(méi)有限制非負(fù)數(shù))
第一次的時(shí)候報(bào)錯(cuò)的原因是,我記錄了每次的maxsum和minsum,沒(méi)有記錄上一次循環(huán)留下的值。
然鵝,上一次的狀態(tài)會(huì)影響到下一次的狀態(tài),所以必須記住上一步的最優(yōu)解。
可以判斷是個(gè)NP問(wèn)題,但是動(dòng)態(tài)規(guī)劃還得多多練習(xí)
202. 快樂(lè)數(shù)
難度:簡(jiǎn)單
編寫(xiě)一個(gè)算法來(lái)判斷一個(gè)數(shù)是不是“快樂(lè)數(shù)”。
一個(gè)“快樂(lè)數(shù)”定義為:對(duì)于一個(gè)正整數(shù),每一次將該數(shù)替換為它每個(gè)位置上的數(shù)字的平方和,然后重復(fù)這個(gè)過(guò)程直到這個(gè)數(shù)變?yōu)?1,也可能是無(wú)限循環(huán)但始終變不到 1。如果可以變?yōu)?1,那么這個(gè)數(shù)就是快樂(lè)數(shù)。
我的題解:
class Solution(object): def isHappy(self, n): """ :type n: int :rtype: bool """ l = [] while 1: l.append(n) n = sum([int(i)**2 for i in str(n)]) if n == 1: return True elif n in l: return False
我的思路:
條件一:要判斷每次的值是否各位平方總和為1,得出是快樂(lè)數(shù)的結(jié)論;
條件二:為了得出非快樂(lè)數(shù)的結(jié)論,這個(gè)數(shù)可能會(huì)陷入循環(huán),那么就要記錄下每輪的值,并進(jìn)行比對(duì)。
其他:
在評(píng)論中發(fā)現(xiàn)了一個(gè)很有趣的算法,就是用dict記錄下肯定會(huì)循環(huán)的數(shù)字的詞典,當(dāng)遇到相關(guān)數(shù)字的時(shí)候就可以跳出了。
一般為{4,16,37,58,89,145,42,20}
204. 計(jì)數(shù)質(zhì)數(shù)
難度:簡(jiǎn)單
統(tǒng)計(jì)所有小于非負(fù)整數(shù) n 的質(zhì)數(shù)的數(shù)量。
我的題解:
class Solution(object): def countPrimes(self, n): """ :type n: int :rtype: int """ if n < 3: return 0 else: output = [1]*n output[0],output[1] = 0,0 for i in range(2,int(n**0.5+1)): if output[i] == 1: m = i**2 while m < n: output[m] = 0 m += i return sum(output)
我的思路:
這個(gè)算法借鑒了評(píng)論里的一個(gè)炒雞有趣的算法,默認(rèn)查詢(xún)是否質(zhì)數(shù)的時(shí)候,我們習(xí)慣用循環(huán)判斷,這樣肯定會(huì)超時(shí)。
而這個(gè)算法呢,叫做厄拉多塞篩法,他給了如下解釋?zhuān)?/p>
比如說(shuō)求20以?xún)?nèi)質(zhì)數(shù)的個(gè)數(shù),首先0,1不是質(zhì)數(shù).2是第一個(gè)質(zhì)數(shù),然后把20以?xún)?nèi)所有2的倍數(shù)劃去.2后面緊跟的數(shù)即為下一個(gè)質(zhì)數(shù)3,然后把3所有的倍數(shù)劃去.3后面緊跟的數(shù)即為下一個(gè)質(zhì)數(shù)5,再把5所有的倍數(shù)劃去.以此類(lèi)推
包括他的題解的寫(xiě)法也很有趣,但是我還沒(méi)弄明白
output[i*i:n:i] = [0] * len(output[i*i:n:i])這一句的意思,還要琢磨下,所以用的是循環(huán)的寫(xiě)法。
def countPrimes(self, n: int) -> int: if n < 3: return 0 else: # 首先生成了一個(gè)全部為1的列表 output = [1] * n # 因?yàn)?和1不是質(zhì)數(shù),所以列表的前兩個(gè)位置賦值為0 output[0],output[1] = 0,0 # 此時(shí)從index = 2開(kāi)始遍歷,output[2]==1,即表明第一個(gè)質(zhì)數(shù)為2,然后將2的倍數(shù)對(duì)應(yīng)的索引 # 全部賦值為0. 此時(shí)output[3] == 1,即表明下一個(gè)質(zhì)數(shù)為3,同樣劃去3的倍數(shù).以此類(lèi)推. for i in range(2,int(n**0.5)+1): if output[i] == 1: output[i*i:n:i] = [0] * len(output[i*i:n:i]) # 最后output中的數(shù)字1表明該位置上的索引數(shù)為質(zhì)數(shù),然后求和即可. return sum(output)總結(jié)
小李今天的做題,是痛并快樂(lè)著的!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/43392.html
摘要:寫(xiě)在前面今天沒(méi)有叨逼叨但是又一次錯(cuò)過(guò)了競(jìng)賽愛(ài)睡覺(jué)的小李下周要上班,下下周一定要參加了握拳認(rèn)真做題的分割線第一題兩地調(diào)度公司計(jì)劃面試人。第人飛往市的費(fèi)用為,飛往市的費(fèi)用為。示例輸入輸出解釋第一個(gè)人去市,費(fèi)用為。 寫(xiě)在前面 今天沒(méi)有叨逼叨...但是又一次錯(cuò)過(guò)了競(jìng)賽...愛(ài)睡覺(jué)的小李...下周要上班,下下周一定要參加了(握拳 認(rèn)真做題的分割線 第一題 1029. 兩地調(diào)度公司計(jì)劃面試2N人。...
摘要:給定的字符串只含有小寫(xiě)英文字母,并且長(zhǎng)度不超過(guò)。其他這題了,要重做看了其他的人的題解,使用的是無(wú)限逼近中位值的辦法,理論基礎(chǔ)應(yīng)該是泰勒公式。萬(wàn)萬(wàn)沒(méi)想到居然用到了泰勒公式手工執(zhí)行了下算法,反而理解的更快,但是泰勒公式還得再?gòu)?fù)習(xí)下。 寫(xiě)在前面的話 今天持續(xù)做題ing,python有意思~今天的題有點(diǎn)虐心...興許是我太笨了...會(huì)努力學(xué)習(xí)的!動(dòng)態(tài)規(guī)劃我來(lái)啦~ 開(kāi)始做題 第一題 459. 重...
摘要:第二題漢明距離難度簡(jiǎn)單兩個(gè)整數(shù)之間的漢明距離指的是這兩個(gè)數(shù)字對(duì)應(yīng)二進(jìn)制位不同的位置的數(shù)目。給出兩個(gè)整數(shù)和,計(jì)算它們之間的漢明距離。第三題買(mǎi)賣(mài)股票的最佳時(shí)機(jī)難度簡(jiǎn)單給定一個(gè)數(shù)組,它的第個(gè)元素是一支給定股票第天的價(jià)格。 寫(xiě)在前面 這幾天斷斷續(xù)續(xù)做了題目,也在慢慢體會(huì)一些數(shù)據(jù)思維。終于不用邊做視頻邊寫(xiě)題目啦~開(kāi)心~把這幾天的題解發(fā)一下~ 認(rèn)真做題的分割線 第一題 977. 有序數(shù)組的平方難度...
摘要:不過(guò)可能還沒(méi)有抓到動(dòng)態(tài)規(guī)劃的真諦,總覺(jué)得哪里需要再校正下思路。這題也是動(dòng)態(tài)規(guī)劃的題目,目標(biāo)總是要分解為子問(wèn)題。總結(jié)看算法圖解的時(shí)候,涉及動(dòng)態(tài)規(guī)劃的小結(jié)中有這樣的每種動(dòng)態(tài)規(guī)劃解決方案都涉及網(wǎng)格。 寫(xiě)在前面的話 感覺(jué)做題越多遇到的寫(xiě)法越多,有種躍躍欲試的感覺(jué)~ 認(rèn)真做題 第一題 70. 爬樓梯難度:簡(jiǎn)單假設(shè)你正在爬樓梯。需要 n 階你才能到達(dá)樓頂。每次你可以爬 1 或 2 個(gè)臺(tái)階。你有多少...
摘要:給定一個(gè)大小為的數(shù)組,找到其中的眾數(shù)。第五題合并兩個(gè)有序數(shù)組難度簡(jiǎn)單給定兩個(gè)有序整數(shù)數(shù)組和,將合并到中,使得成為一個(gè)有序數(shù)組。說(shuō)明初始化和的元素?cái)?shù)量分別為和。第六題二叉樹(shù)的最大深度難度簡(jiǎn)單給定一個(gè)二叉樹(shù),找出其最大深度。 寫(xiě)在前面的話 做做做題,慢慢上手了就覺(jué)得刷題速度變快了,果然還是有點(diǎn)笨~希望最后一竅快點(diǎn)通吧~ 開(kāi)始做題 第一題 169. 求眾數(shù)難度:簡(jiǎn)單給定一個(gè)大小為 n 的數(shù)組...
閱讀 2229·2021-10-14 09:43
閱讀 2257·2019-08-30 15:55
閱讀 787·2019-08-30 14:23
閱讀 2074·2019-08-30 13:21
閱讀 1290·2019-08-30 12:50
閱讀 2248·2019-08-29 18:46
閱讀 2340·2019-08-29 17:28
閱讀 2430·2019-08-29 17:21