好久不見 太忙了沒寫記錄 但是題目還是一直在做的哦 55-60
阿新 • • 發佈:2021-10-16
55跳躍遊戲
採用了第一次學的的那個方法
維持一個max: 這一步能到達的最遠距離
nextmax 下一步能到達的最遠距離
當nextmax到n-1時 直接返回
當index到max時 檢查下一步
class Solution: def canJump(self, nums: List[int]) -> bool: max = 0 nextmax = nums[0] n = len(nums) for index,each in enumerate(nums): temp = index+each #這個下標的最遠距離if nextmax >= n-1: #能到最後就返回 return True if temp > nextmax: #下一步能更遠了 更新NEXTMAX nextmax = temp if index == max: 到這一步終點了 算算賬 if nextmax == index : 不能走了 返回falsereturn False else: 還能走 走上下一步. max = nextmax 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/jump-game/solution/gen-shang-ci-de-tiao-yue-you-xi-chai-bu-odu3i/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
482金鑰格式化
簡單題 我直接暴力解法
先算有幾個-號 除去- 的長度對k取餘 就是第一個-前的長度
先把第一個寫了
遍歷 不是-號的加入結果 num計數 num = k個後就加一個- 號 num歸0
最後返回時不能要最後一個-號
class Solution: def licenseKeyFormatting(self, s: str, k: int) -> str: ns = len(s) n_ = 0 for each in s : if each == '-': n_ +=1 rel = "" len0 = (ns - n_)%k index = 0 if len0 != 0: while index < ns : if s[index] != '-': rel += s[index].upper() index += 1 if len(rel) == len0: rel += '-' break num = 0 for i in range(index,ns): if s[i] != '-': rel+= s[i].upper() num += 1 if num == k: rel += '-' num = 0 return rel[:-1] 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/license-key-formatting/solution/bao-li-jie-fa-ge-by-yizhu-jia-00ah/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
56 .合併區間
先排序 然後和結果裡的前一個比 考慮和前一個合併就好
超越93的時間和97的空間 排序就是神!!
rel[-1][1] = max(interval[1],rel[-1][1]) 這一步寫錯了好多次
class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: intervals = sorted(intervals) rel = [intervals[0]] for interval in intervals: if interval[0] <= rel[-1][1]: rel[-1][1] = max(interval[1],rel[-1][1]) else: rel.append(interval) return rel 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/merge-intervals/solution/chao-yue-93de-shi-jian-he-97de-kong-jian-wfko/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
414第三大的數
就是維持三個指標 本來想寫成堆那樣的
被多數人擊敗
class Solution: def thirdMax(self, nums: List[int]) -> int: first = -2**31-1 second = -2**31-2 third = -2**31-3 for each in nums[0:]: if each > third: if each < second: third = each elif each == second: continue elif each < first: third = second second = each elif each > first: third = second second = first first = each if third == second or third < -2**31: return first else: return third 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/third-maximum-number/solution/bei-duo-shu-ren-ji-bai-by-yizhu-jia-fn8r/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
57 插入區間
我好像是用空間換了時間? 擊敗了百分之99.9的人
這個程式碼著實有點難看懂 我自己都不是很懂。。。 我儘量寫註釋
class Solution: def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]: if intervals == []: return [newInterval] n = len(intervals) left = n #left表示新區間要放置的下標 如果前面沒找到就是n了 right = n #right表示最右合併到哪個區間 for index,each in enumerate(intervals): temp = newInterval[0] if temp <= each[1]: left = index break 找到要插入的那個下標 for index,each in enumerate(intervals[left:]): temp = newInterval[1] if temp <= each[1]: if temp >=each[0]: right= index+left+1 else: right= index+left #這裡比如[[1,2],[5,6]] 插入【3,4】的話right就是1 插入【3,5.5】的話就是2 break #要看右邊界在不在index+left的區間裡 if left == n: intervals.append(newInterval) #如果新插入的比最右邊區間還右 就append elif right == 0: #比最左邊的還左 就插入第一位裡 intervals.insert(0,newInterval) else: temp = [min(intervals[left][0],newInterval[0]),max(intervals[right-1][1],newInterval[1])] #這句是重點了 分為重合區間和不重合區間 如 [[1,2],[5,6]] 插入[3,4] left是1 temp的左邊是3和5比 因為如果新區間左邊小 # 無論合不合並 這個位置都是小的那個 [[1,2],[2.5,6]] 插入[3,4] left是1 temp左邊就是2.5和3 還是選擇2.5 #對於temp[1] 就是右邊 這就是為什麼上面求right 要加1 。如 [[1,2],[5,6]] 插入[3,4] 這時right 是1 是4在和2比 當然大 就保住了4 #一旦要發生合併 right 就會加1 這時比較就是和當前區間的右邊比了 [[1,2],[2.5,6]] 插入[3,4] right是2 4和6在比 intervals.insert(left,temp) #插入相應位置 del intervals[left+1:right+1] #刪除被合併的那些區間 因為前面插入了 所以這裡都要加1. #如果left=right 說明right沒有加1 也就說明沒有發生合併 單純插入 就不需要刪除了 return intervals 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/insert-interval/solution/wo-shi-yong-kong-jian-huan-liao-shi-jian-5053/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
58最後一個單詞的長度
簡單題
倒過來數 先數空格 再數字母數
class Solution: def lengthOfLastWord(self, s: str) -> int: nspace = 0 rel = 0 for each in s[::-1]: if each == ' ': nspace +=1 else: break for each in s[-(nspace+1)::-1]: if each != ' ': rel += 1 else: break return rel 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/length-of-last-word/solution/xian-shu-kong-ge-zai-shu-zi-mu-shu-by-yi-4hal/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
434 字串中的單詞數
被大多數人擊敗我估計他們都用得split 哼!
class Solution: def countSegments(self, s: str) -> int: count = 0 flag = 0 for each in s: if each != ' ' and flag == 0: count += 1 flag = 1 elif each == ' ': flag = 0 return count 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/number-of-segments-in-a-string/solution/bei-da-bu-fen-ren-ji-bai-by-yizhu-jia-euwm/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
59 螺旋矩陣
跟我之前方法一樣四面牆往中間擠
class Solution: def generateMatrix(self, n: int) -> List[List[int]]: count = 1 top = left = 0 rel = [[0 for i in range(n)] for j in range(n)] right = down = n-1 while count <= n*n: for i in range(left,right+1): rel[top][i] = count count += 1 top += 1 if count > n*n: break for i in range(top,down+1): rel[i][right] = count count += 1 right -=1 if count > n*n: break for i in range(right,left-1,-1): rel[down][i] = count count += 1 down -=1 if count > n*n: break for i in range(down,top-1,-1): rel[i][left] = count count += 1 left +=1 return rel 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/spiral-matrix-ii/solution/gen-zhi-qian-de-yi-mo-yi-yang-si-mian-qi-8udj/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
187 重複的DNA序列
直接一個雜湊的雜湊
class Solution: def findRepeatedDnaSequences(self, s: str) -> List[str]: n = len(s) if n <= 10: return [] rel = [] dict1= {} i = 0 while i <= n-10: s1 = s[i:i+10] if s1 not in dict1: dict1[s1] = 1 elif dict1[s1] == 1: rel.append(s1) dict1[s1] += 1 i += 1 return rel 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/repeated-dna-sequences/solution/haxidehaxi-by-yizhu-jia-0lm0/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
60 排序序列
普通的遞迴普通的一天
就是看K是 n-1 階乘的X倍
是X倍就是取第X小的那個數字 (因為 以第一小的數開頭的數有(N-1)!個 所以找的就是k是以第幾個數字開頭的)
把這個數字加入結果,從待選列表中刪除它。
用K-X*(n-1)!
表示看K是剩下n-1個數字中的第幾位
遞迴到短一位的陣列中
class Solution: def getPermutation(self, n: int, k: int) -> str: def myfactorial(n): #定義階乘函式 temp = 1 for i in range(1,n+1): temp *= i return temp def getnk(resnum,reslen,k): nonlocal rel if reslen == 1: #如果只剩一個數待選 加入結果返回 其實判不判斷都一樣 但是總要有一個遞迴出口嘛 rel += str(resnum[0]) else: i = 0 resfactorial = myfactorial(reslen-1) while k > resfactorial : #當k比(n-1)!大的時候 就說明不能以第一個數作為開頭 往後找 k -= myfactorial(reslen-1) i = i+1 rel += str(resnum[i]) resnum.remove(resnum[i]) #把第X位加入結果 把第X個數從候選中刪除 getnk(resnum,reslen-1,k) #去後面找 rel = '' resnum = [i for i in range(1,n+1)] getnk(resnum,len(resnum),k) return rel 作者:yizhu-jia 連結:https://leetcode-cn.com/problems/permutation-sequence/solution/pu-tong-de-di-gui-pu-tong-de-yi-tian-xia-nclb/ 來源:力扣(LeetCode) 著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
謝謝大家!