欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 美景 > LeetCode 每日一题 2025/5/5-2025/5/11

LeetCode 每日一题 2025/5/5-2025/5/11

2025/5/13 23:39:42 来源:https://blog.csdn.net/zkt286468541/article/details/147811817  浏览:    关键词:LeetCode 每日一题 2025/5/5-2025/5/11

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


目录

      • 5/5 790. 多米诺和托米诺平铺
      • 5/6 1920. 基于排列构建数组
      • 5/7 3341. 到达最后一个房间的最少时间 I
      • 5/8 3342. 到达最后一个房间的最少时间 II
      • 5/9 3343. 统计平衡排列的数目
      • 5/10 2918. 数组的最小相等和
      • 5/11 1550. 存在连续三个奇数的数组


5/5 790. 多米诺和托米诺平铺

dp
假设dp[i][x]为第i列状态 0一个没有铺 1上方格子被铺 2下方格子被铺 3两个格子都被铺
dp[i][0] = dp[i-1][3]
dp[i][1] = dp[i-1][0]+dp[i-1][2]
dp[i][2] = dp[i-1][0]+dp[i-1][1]
dp[i][3] = dp[i-1][0]+dp[i-1][1]+dp[i-1][2]+dp[i-1][3]

def numTilings(n):""":type n: int:rtype: int"""MOD=10**9+7dp = [[0]*4 for _ in range(n+1)]dp[0][3]=1for i in range(1,n+1):dp[i][0] = dp[i-1][3]dp[i][1] = (dp[i-1][0]+dp[i-1][2])%MODdp[i][2] = (dp[i-1][0]+dp[i-1][1])%MODdp[i][3] = (dp[i-1][0]+dp[i-1][1]+dp[i-1][2]+dp[i-1][3])%MODreturn dp[n][3]

5/6 1920. 基于排列构建数组

按照要求构建

def buildArray(nums):""":type nums: List[int]:rtype: List[int]"""return [nums[nums[i]] for i in range(len(nums))]

5/7 3341. 到达最后一个房间的最少时间 I

ans[x][y]记录到达x,y位置的最少时间
dijkstra 根据x,y得到到他周围最短时间

def minTimeToReach(moveTime):""":type moveTime: List[List[int]]:rtype: int"""import heapqn,m=len(moveTime),len(moveTime[0])ans=[[float("inf")]*m for _ in range(n)]ans[0][0]=0steps=[(1,0),(-1,0),(0,1),(0,-1)]l=[(0,0,0)]while True:d,i,j=heapq.heappop(l)if i==n-1 and j==m-1:return dif d>ans[i][j]:continuefor dx,dy in steps:x,y=i+dx,j+dyif 0<=x<n and 0<=y<m:newd = max(d,moveTime[x][y])+1if newd<ans[x][y]:ans[x][y]=newdheapq.heappush(l, (newd,x,y))

5/8 3342. 到达最后一个房间的最少时间 II

ans[x][y]记录到达x,y位置的最少时间
dijkstra 根据x,y得到到他周围最短时间
每走一步耗时在1,2之间变化 根据位置和的奇偶性可以判断 x+y偶数耗时1 奇数耗时2

def minTimeToReach(moveTime):""":type moveTime: List[List[int]]:rtype: int"""import heapqn,m=len(moveTime),len(moveTime[0])ans=[[float("inf")]*m for _ in range(n)]ans[0][0]=0steps=[(1,0),(-1,0),(0,1),(0,-1)]l=[(0,0,0)]while True:d,i,j=heapq.heappop(l)if i==n-1 and j==m-1:return dif d>ans[i][j]:continueadd = (i+j)%2for dx,dy in steps:x,y=i+dx,j+dyif 0<=x<n and 0<=y<m:newd = max(d,moveTime[x][y])+1+addif newd<ans[x][y]:ans[x][y]=newdheapq.heappush(l, (newd,x,y))

5/9 3343. 统计平衡排列的数目

https://leetcode.cn/problems/count-number-of-balanced-permutations/solutions/3670620/tong-ji-ping-heng-pai-lie-de-shu-mu-by-l-ki3d/?envType=daily-question&envId=2025-05-09

def countBalancedPermutations(num):""":type num: str:rtype: int"""from collections import Counterimport mathMOD=10**9+7num=list(map(int,num))total=sum(num)if total%2:return 0target = total//2cnt = Counter(num)n=len(num)maxOdd = (n+1)//2psum=[0]*11for i in range(9,-1,-1):psum[i]=psum[i+1]+cnt[i]mem={}def dfs(pos,cur,oddcnt):if (pos,cur,oddcnt) in mem:return mem[(pos,cur,oddcnt)]if oddcnt<0 or psum[pos]<oddcnt or cur>target:mem[(pos,cur,oddcnt)]=0return 0if pos>9:mem[(pos,cur,oddcnt)]=int(cur==target and oddcnt==0)return int(cur==target and oddcnt==0)evencnt=psum[pos]-oddcntans=0for i in range(max(0,cnt[pos]-evencnt),min(cnt[pos],oddcnt)+1):ways=math.comb(oddcnt,i)*math.comb(evencnt,cnt[pos]-i)%MODans += ways*dfs(pos+1, cur+i*pos, oddcnt-i)mem[(pos,cur,oddcnt)]=ans%MODreturn ans%MODreturn dfs(0,0,maxOdd)

5/10 2918. 数组的最小相等和

正整数最小为1
统计数组当前和 以及0的个数
将所有0变为1 返回较大的值
如果较小数组中没有0 则无法相等

def minSum(nums1, nums2):""":type nums1: List[int]:type nums2: List[int]:rtype: int"""s1,s2=sum(nums1),sum(nums2)z1,z2=nums1.count(0),nums2.count(0)s1+=z1s2+=z2if s1>s2:if z2==0:return -1else:return s1elif s1<s2:if z1==0:return -1else:return s2return s1

5/11 1550. 存在连续三个奇数的数组

依次判断 i-1,i,i+1是否是奇数

def threeConsecutiveOdds(arr):""":type arr: List[int]:rtype: bool"""n=len(arr)for i in range(1,n-1):if arr[i-1]%2 and arr[i]%2 and arr[i+1]%2:return Truereturn False

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词