2021-05-04leetcode刷题

2021-05-04  本文已影响0人  Cipolee

401. 二进制手表

二进制手表

给定一个非负整数 n 代表当前 LED 亮着的数量,返回所有可能的时间
超过表示范围(小时 0-11,分钟 0-59)的数据将会被舍弃,也就是说不会出现 "13:00", "0:61" 等时间。

class Solution:
    def readBinaryWatch(self, turnedOn: int) -> List[str]:
        if turnedOn>10:
            return []
        ans=[]
        #extra_len=0 if turnedOn<=7 else turnedOn-7
        #hours和minutes的数字顺序是机关重要的

        #在10个灯里面选择,必须保证hour[i]和minute[i]不能同时选择
        hours=[8,4,2,1,0,0,0,0,0,0]
        minutes=[0,0,0,0,32,16,8,4,2,1]
        def dfs(num,index,hour,minute):
            if hour>11 or minute>59:
                return#剪枝
            if num==0:
                ans.append("{}:{:0>2}".format(hour,minute))
                return 
            for i in range(index,10):
                dfs(num-1,i+1,hour+hours[i],minute+minutes[i])
        dfs(turnedOn,0,0,0)
        return ans

处理方式是,既可以遍历10种不同的灯,又将小时和分钟的数据区分开;同时为了防止选择num个灯的相同顺序不同,统一安排好一个顺序,即选择了该灯,后面的选择,该灯前面的都不应该选。

递归函数:
  for 遍历情况:
    递归函数

给你一个 严格升序排列 的正整数数组 arr 和一个整数 k 。

请你找到这个数组里第 k 个缺失的正整数。

注意的问题,边界条件,列表越界问题

必须熟练计算复杂度,以降低运行时间

    def findKthPositive(self, arr: List[int], k: int) -> int:
        #设置一个变量count从1开始递增
        #设置一个miss的量,作为结束标志
        #设置一个arr的index
##低内存,低运行时间方案
        count,miscount,index,current=1,0,0,1
        length=len(arr)-1
        while miscount<k:
            if count==arr[index]:
                if index<length:
                    index+=1
            else:
                miscount+=1
                current=count
            count+=1
        return current
        
        '''
        max_=max(arr)
        #遍历一遍
        list_all=list(range(1,max_+k+1))#O(n)
        cnt=0
        for i in list_all:#O(n)
            if i not in arr:#O(n)
                cnt+=1
                if cnt==k:
                    return i
       
        '''

你的初始 能量 为 P,初始 分数 为 0,只有一包令牌 tokens 。其中 tokens[i] 是第 i 个令牌的值(下标从 0 开始)。
令牌可能的两种使用方法如下:
如果你至少有 token[i] 点 能量 ,可以将令牌 i 置为正面朝上,失去 token[i] 点 能量 ,并得到 1 分 。
如果我们至少有 1 分 ,可以将令牌 i 置为反面朝上,获得 token[i] 点 能量 ,并失去 1 分 。
每个令牌 最多 只能使用一次,使用 顺序不限 ,不需 使用所有令牌。
在使用任意数量的令牌后,返回我们可以得到的最大 分数 。

为什么使用贪心?使用贪心能否达到全局最优的数学证明:

数学证明
class Solution(object):
    def bagOfTokensScore(self, tokens, P):
    #只能使用贪心,不存在使用正面中间来替换大的能量来收获更多小的能量
        ans=0
        tokens=sorted(tokens)
        #使用队列作为数据结构,分别用来弹出
        deque=collections.deque(tokens)
        current=0
        while deque and(P>=deque[0] or current):
            while deque and P>=deque[0]:
                P-=deque.popleft()
                current+=1
            ans=max(ans,current)
            if deque and current:
                P+=deque.pop()
                current-=1
        return ans

给你一个整数 num 。

你可以对它进行如下步骤恰好 两次 :
选择一个数字 x (0 <= x <= 9).
选择另一个数字 y (0 <= y <= 9) 。数字 y 可以等于 x 。
将 num 中所有出现 x 的数位都用 y 替换。
得到的新的整数 不能 有前导 0 ,得到的新整数也 不能 是 0 。
令两次对 num 的操作得到的结果分别为 a 和 b 。
请你返回 a 和 b 的 最大差值 。

class Solution:
    def maxDiff(self, num: int) -> int:
        #大:找到第一个非9数改为9
        #小:从1开始找到第一个非0数改为0
        str_num=str(num)
        min_flag=False
        min_index,max_index=0,0#该max_index在计算中后移一位
        for i in range(len(str_num)):
            if not min_index:
                if  str_num[i]!=str_num[0] and i>0 and str_num[i]>'0' :
                    min_flag=True
                    min_index=i
            if not max_index:
                if str_num[i]<'9':
                    max_index=i+1
        #print("str_num is",str_num)
        str_num1=str_num
        if not min_flag or str_num[0]>'1':
            str_num1=str_num.replace(str_num[0],'1')
        else:
            str_num1=str_num.replace(str_num[min_index],'0')
        #print("str_num is",str_num)
        str_num2=str_num
        str_num2=str_num.replace(str_num[max_index-1],'9')
        
        return int(str_num2)-int(str_num1)

list可以通过extend可迭代序列增加步长

zip(*)可以序列解包,在大的函数与程序中可能经常使用

a=[[1,2,3],[4,5,6],[7,8,9]]
b,c,d=zip(*a)
print(b,c,d)
'''
(1, 4, 7) (2, 5, 8) (3, 6, 9)
'''

unsqueeze(index)在index列上加一个维度
squeeze(index)在index上减一个列,如果本来就是1维就不再减

上一篇 下一篇

猜你喜欢

热点阅读