记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
-
-
- [12/29 756. 金字塔转换矩阵](#12/29 756. 金字塔转换矩阵)
- [12/30 840. 矩阵中的幻方](#12/30 840. 矩阵中的幻方)
- [12/31 1970. 你能穿过矩阵的最后一天](#12/31 1970. 你能穿过矩阵的最后一天)
- [1/1 66. 加一](#1/1 66. 加一)
- [1/2 961. 在长度 2N 的数组中找出重复 N 次的元素](#1/2 961. 在长度 2N 的数组中找出重复 N 次的元素)
- [1/3 1411. 给 N x 3 网格图涂色的方案数](#1/3 1411. 给 N x 3 网格图涂色的方案数)
- [1/4 1390. 四因数](#1/4 1390. 四因数)
-
12/29 756. 金字塔转换矩阵
将一个三角金字塔底部映射
python
def pyramidTransition(bottom, allowed):
"""
:type bottom: str
:type allowed: List[str]
:rtype: bool
"""
n=len(bottom)
T=[[0]*7 for _ in range(7)]
for a in allowed:
l=ord(a[0])-ord('A')
r=ord(a[1])-ord('A')
top = ord(a[2])-ord('A')
T[l][r] |= (1<<top)
s=set()
A=[[0]*n for _ in range(n)]
for i,c in enumerate(bottom):
A[n-1][i]=ord(c)-ord('A')
def check(state,m,i):
if m==1 and i==1:
return True
elif i==m:
if state in s:
return False
s.add(state)
return check(0,m-1,0)
else:
v = T[A[m][i]][A[m][i+1]]
for b in range(7):
if (v>>b)&1:
A[m-1][i]=b
if check(state*8+(b+1),m,i+1):
return True
return False
return check(0,n-1,0)
12/30 840. 矩阵中的幻方
检查每个3x3矩阵
python
def numMagicSquaresInside(grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
n,m=len(grid),len(grid[0])
def check(a,b,c,d,e,f,g,h,i):
return sorted([a,b,c,d,e,f,g,h,i])==list(range(1,10)) and (a+b+c==d+e+f==a+d+g==b+e+h==a+e+i==c+e+g==15)
ans=0
for i in range(n-2):
for j in range(m-2):
if grid[i+1][j+1]!=5:
continue
if check(grid[i][j],grid[i][j+1],grid[i][j+2],
grid[i+1][j],grid[i+1][j+1],grid[i+1][j+2],
grid[i+2][j],grid[i+2][j+1],grid[i+2][j+2]):
ans+=1
return ans
12/31 1970. 你能穿过矩阵的最后一天
二分 找到刚好能通行的最后一天
python
def latestDayToCross(row, col, cells):
"""
:type row: int
:type col: int
:type cells: List[List[int]]
:rtype: int
"""
ans=0
l,r=0,row*col
while l<=r:
mid = (l+r)//2
g=[[1]*col for _ in range(row)]
for x,y in cells[:mid]:
g[x-1][y-1]=0
li=[]
for i in range(col):
if g[0][i]:
li.append((0,i))
g[0][i]=0
found=False
while li:
tmp=[]
for x,y in li:
for nx,ny in [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]:
if 0<=nx<row and 0<=ny<col and g[nx][ny]:
if nx==row-1:
found=True
break
tmp.append((nx,ny))
g[nx][ny]=0
if found:
break
li=tmp[:]
if found:
ans=mid
l=mid+1
else:
r=mid-1
return ans
1/1 66. 加一
在最低位+1 如果需要进位则可以继续往下考虑
python
def plusOne(digits):
"""
:type digits: List[int]
:rtype: List[int]
"""
n = len(digits)-1
while n>=0:
digits[n] +=1
if digits[n]>9:
digits[n]=0
else:
break
n-=1
if digits[0]==0:
digits = [1]+digits
return digits
1/2 961. 在长度 2N 的数组中找出重复 N 次的元素
只能有一个数值出现n次 如果某个值出现不止一次就是他
python
def repeatedNTimes(nums):
"""
:type nums: List[int]
:rtype: int
"""
m={}
for num in nums:
if num in m:
return num
m[num]=1
1/3 1411. 给 N x 3 网格图涂色的方案数
满足的涂色方案有两类ABA,ABC
dp0表示ABC dp1表示ABA
如果前一行是ABC 这一行是ABC 如012 这一行可以120 201两种
如果前一行是ABC 这一行是ABA 如012 这一行可以101 121两种
如果前一行是ABA 这一行是ABC 如010 这一行可以102 201两种
如果前一行是ABA 这一行是ABA 如010 这一行可以121 101 202三种
dp[i][0]=dp[i-1][0]*2+dp[i-1][1]*2
dp[i][1]=dp[i-1][0]*2+dp[i-1][1]*3
python
def numOfWays(n):
"""
:type n: int
:rtype: int
"""
MOD=10**9+7
dp0,dp1=6,6
for i in range(2,n+1):
dp0,dp1=(2*(dp0+dp1))%MOD,(dp0*2+dp1*3)%MOD
return (dp0+dp1)%MOD
1/4 1390. 四因数
只能有四个因数 出去1和自身
其他两个有两种情况
1.两个需要是素数
2.一个是素数 一个是前一个素数的平方 即该数值为p**3 因数有1,p,pp,p p*p
根据欧拉筛找出所有素数
找到所有四因数的整数
python
def sumFourDivisors(nums):
"""
:type nums: List[int]
:rtype: int
"""
N=100001
prime=[]
isprime=[True]*N
for i in range(2,N):
if isprime[i]:
prime.append(i)
for p in prime:
if p*i>=N:
break
isprime[p*i]=False
if i%p==0:
break
m={}
for p in prime:
if p<=46:
m[p**3] = 1+p+p**2+p**3
for i in range(len(prime)):
for j in range(i+1,len(prime)):
if prime[i]*prime[j]<N:
m[prime[i]*prime[j]]=1+prime[i]+prime[j]+prime[i]*prime[j]
else:
break
ans=0
for num in nums:
if num in m:
print(num,m[num])
ans+=m[num]
return ans