青海专业网站建设推广平台建设百度服务电话
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 4/7 416. 分割等和子集
- 4/8 3396. 使数组元素互不相同所需的最少操作次数
- 4/9 3375. 使数组的值全部为 K 的最少操作次数
- 4/10 2999. 统计强大整数的数目
- 4/11 2843. 统计对称整数的数目
- 4/12 3272. 统计好整数的数目
- 4/13 1922. 统计好数字的数目
4/7 416. 分割等和子集
和是奇数则不可能
dp[x]判断和为x是否取的到
def canPartition(nums):""":type nums: List[int]:rtype: bool"""x=sum(nums)if x%2:return Falsex//=2dp=[False]*(x+1)dp[0]=Truen=len(nums)for i in range(n):for j in range(x,-1,-1):if j-nums[i]>=0:dp[j]=dp[j] or dp[j-nums[i]]return dp[x]
4/8 3396. 使数组元素互不相同所需的最少操作次数
从后往前找到第一次出现相同元素的位置
def minimumOperations(nums):""":type nums: List[int]:rtype: int"""n=len(nums)s=set()loc=n-1while loc>=0:if nums[loc] in s:breaks.add(nums[loc])loc-=1return 0 if loc==-1 else loc//3+1
4/9 3375. 使数组的值全部为 K 的最少操作次数
如果k大于nums中的最小值 则不可能
只要计算nums中不同数值个数就可以
def minOperations(nums, k):""":type nums: List[int]:type k: int:rtype: int"""if min(nums)<k:return -1s = set(nums)ans = len(s)if k in s:ans-=1return ans
4/10 2999. 统计强大整数的数目
递归
dfs(i,limitl,limith) 表示第i位及之后位置能够组成满足条件的数字数量
limitl,limith分别表示当前位是否受到start,finish的约束
不受约束则可以填入[0,limit]
def numberOfPowerfulInt(start, finish, limit, s):""":type start: int:type finish: int:type limit: int:type s: str:rtype: int"""l,h=str(start),str(finish)n=len(h)l=l.zfill(n)prelen=n-len(s)mem={}def dfs(i,limitl,limith):if (i,limitl,limith) in mem:return mem[(i,limitl,limith)]if i==n:return 1lo=int(l[i]) if limitl else 0hi=int(h[i]) if limith else 9ans = 0if i<prelen:for d in range(lo,min(hi,limit)+1):ans += dfs(i+1,limitl and d==lo,limith and d==hi)else:x=int(s[i-prelen])if lo<=x<=min(hi,limit):ans=dfs(i+1,limitl and x==lo,limith and x==hi)mem[(i,limitl,limith)]=ansreturn ansreturn dfs(0,True,True)
4/11 2843. 统计对称整数的数目
考虑两位数 11的倍数
四位数 前两位和等于后两位和
def countSymmetricIntegers(low, high):""":type low: int:type high: int:rtype: int"""ans=0for i in range(low,high+1):if i<100 and i%11==0:ans+=1if 1000<i<10000:if i//1000+i%1000//100==i%100//10+i%10:ans+=1return ans
4/12 3272. 统计好整数的数目
列举所有K回文数 对每个数计算排列组合
def countGoodIntegers(n, k):""":type n: int:type k: int:rtype: int"""nums=set()base=10**((n-1)//2)sk=n&1for i in range(base,base*10):s=str(i)s+=s[::-1][sk:]num=int(s)if num%k==0:nums.add(''.join(sorted(s)))def fac(num):n=1for i in range(1,num+1):n*=ireturn nf=[fac(i) for i in range(n+1)]ans=0for s in nums:cnt=[0]*10for c in s:cnt[int(c)]+=1t = (n-cnt[0])*f[n-1]for x in cnt:t//=f[x]ans+=treturn ans
4/13 1922. 统计好数字的数目
偶数位置有0,2,4,6,8 五种
奇数位置有2,3,5,7 四种
def countGoodNumbers(n):""":type n: int:rtype: int"""MOD=10**9+7def func(x,y):ans,mul=1,xwhile y>0:if y%2==1:ans= ans*mul%MODmul = (mul**2)%MODy=y//2return ansreturn func(5,(n+1)//2)*func(4,n//2)%MOD