好久不见 太忙了没写记录 但是题目还是一直在做的哦 55-60
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 : 不能走了 返回false return 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) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
谢谢大家!

浙公网安备 33010602011771号