美文网首页
2021-05-04leetcode刷题

2021-05-04leetcode刷题

作者: Cipolee | 来源:发表于2021-05-04 17:31 被阅读0次

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 分 。
每个令牌 最多 只能使用一次,使用 顺序不限 ,不需 使用所有令牌。
在使用任意数量的令牌后,返回我们可以得到的最大 分数 。

  • ans表示为该策略中出现的最大数量情况。current是目前的分数(关系到能不能换取大能量的token,换取大能量的策略是一次换一个也可以,这样组合更多,遍历了每一种情况)
  • 使用collections的deque用来删除元素,可以进行记忆,这种数据结构挺强大的

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

数学证明
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维就不再减

相关文章

  • 2021-05-04leetcode刷题

    401. 二进制手表[https://leetcode-cn.com/problems/binary-watch/...

  • 刷题刷题

    时间紧迫,任务繁重,又有疫情影响,搞的人心惶惶,一时间复习得不安宁,又舍不得摆烂。 在焦灼、惶恐的情绪中,紧张急迫...

  • 2022-09-16

    刷题,刷题还是刷题

  • 2018-07-16

    刷题,祸害的何止是教育? 报班,刷题;买练习册,刷题;家教,刷题;跟不上,刷题;学得好,刷题;为了抢跑,刷题;为了...

  • 刷题啊刷题

    因为月底又要考试,所以最近几天一直在刷题。按说是看了书再看视频再刷题效果比较好才是。可是来不及了啊。 上次考试,就...

  • 刷题啊刷题

    刷题啊刷题 因为11月中旬要举行期中考试,所以最近几天,学校精心组织,一直在刷题。按说是看了书再看PPT课件或教师...

  • 2020-02-01关于刷题的几个建议

    算法刷题 针对性刷题,刻意练习。刻意刷题!不是麻木刷题!刷题前一定要先看书,清楚明白为什么要刷这些题,这些题刷完能...

  • 刷题

    清早起来刷题 吃饭也在刷题 上厕所也在刷题 中午也在刷题 下午也在刷题 晚上也在刷题 一天到晚都在刷题 考试马上到...

  • 程序猿刷题网站你知道吗?

    Coderbyte 刷题网LeetCode 刷题网Stack Overflow 刷题网

  • 教你怎么做一只考试锦鲤

    考试前14天疯狂刷题,各个平台疯狂刷题,刷题就对了。 刷的越多,大脑记得越多,也许你刷10道题,能记住的只有1道题...

网友评论

      本文标题:2021-05-04leetcode刷题

      本文链接:https://www.haomeiwen.com/subject/jowcdltx.html