记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
-
-
- 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