天天看点

LeetCode 每日一题 2023/2/20-2023/2/26

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

目录

      • 2/20 2347. 最好的扑克手牌
      • 2/21 1326. 灌溉花园的最少水龙头数目
      • 2/22 1140. 石子游戏 II
      • 2/23 1238. 循环码排列
      • 2/24 2357. 使数组中所有元素都等于零
      • 2/25
      • 2/26

2/20 2347. 最好的扑克手牌

分别判断每一种情况

将数组去重 根据个数来判断

def bestHand(ranks, suits):
    """
    :type ranks: List[int]
    :type suits: List[str]
    :rtype: str
    """
    if len(set(suits))==1:
        return "Flush"
    m = {}
    for r in ranks:
        m[r] = m.get(r,0)+1
    if len(m)==5:
        return "High Card"
    ans = "Pair"
    for v in m.values():
        if v>=3:
            ans = "Three of a Kind"
    return ans



           

2/21 1326. 灌溉花园的最少水龙头数目

记录每个点能够到达的左右边缘

记录每个点能够到达的最远右端right[i]

last记录当前能够到达的最远右端

pre记录已选择的某区域边缘

如果当前i=last说明 下一步无法覆盖了

如果i=pre 说明之前选的区域用完 需要下一个区域ans+1

def minTaps(n, ranges):
    """
    :type n: int
    :type ranges: List[int]
    :rtype: int
    """
    right = list(range(n+1))
    for i,r in enumerate(ranges):
        l,r = max(0,i-r),min(n,i+r)
        right[l] = max(right[l],r)
    
    last,ans,pre =0,0,0
    for i in range(n):
        last = max(last,right[i])
        if i==last:
            return -1
        if i==pre:
            pre = last
            ans +=1
    return ans



           

2/22 1140. 石子游戏 II

s[i]记录后缀和sum(piles[i:])

如果i+2*m>n 可以把后面的都拿了

遍历所有可能的x 找到后一个步最少的可能性 得到此时最大值

mem记忆(i,m)的结果

def stoneGameII(piles):
    """
    :type piles: List[int]
    :rtype: int
    """
    s = piles[:]
    n = len(piles)
    for i  in range(n-2,-1,-1):
        s[i]+=s[i+1]
    mem = {}
    def dfs(i,m):
        if (i,m) in mem:
            return mem[(i,m)]
        if i+2*m>=n:
            mem[(i,m)] = s[i]
            return s[i]
        ans = s[i]-min(dfs(i+x,max(m,x)) for x in range(1,m*2+1))
        mem[(i,m)] = ans
        return ans
    return dfs(0,1)


           

2/23 1238. 循环码排列

格雷码生成 相邻二进制只有一位不同
def circularPermutation(n, start):
    """
    :type n: int
    :type start: int
    :rtype: List[int]
    """
    ans = [0]*(1<<n)
    for i in range(1<<n):
        ans[i] = (i>>1)^i^start
    return ans


           

2/24 2357. 使数组中所有元素都等于零

统计nums中不同的非零数个数即可
def minimumOperations(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    s = set(nums)
    ans = len(s)
    if 0 in s:
        ans -=1
    return ans


           

2/25

2/26