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

 

谢谢大家!

 

posted @ 2021-10-16 10:03  yi术家  阅读(102)  评论(0)    收藏  举报