LeetCode 每日一题 2025/3/17-2025/3/23
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
- 3/17 1963. 使字符串平衡的最小交换次数
- 3/18 2614. 对角线上的质数
- 3/19 2610. 转换二维数组
- 3/20 2612. 最少翻转操作数
- 3/21 2680. 最大或值
- 3/22 2643. 一最多的行
- 3/23 2116. 判断一个括号字符串是否有效
3/17 1963. 使字符串平衡的最小交换次数
从左到右 遍历[个数与]要一一匹配
cur记录当前[个数 如果是负数了 说明需要交换一次 这次]变成[
def minSwaps(s):
"""
:type s: str
:rtype: int
"""
cur=0
ans=0
for c in s:
if c=='[':
cur+=1
else:
cur-=1
if cur<0:
cur=1
ans+=1
return ans
3/18 2614. 对角线上的质数
取出对角线的所有数 从大到小依次判断
def diagonalPrime(nums):
"""
:type nums: List[List[int]]
:rtype: int
"""
import math
def check(num):
for i in range(2,int(math.sqrt(num)+1)):
if num%i==0:
return False
return num>=2
n=len(nums)
l = [nums[i][i] for i in range(n)]+[nums[i][n-1-i] for i in range(n)]
l.sort(reverse=True)
for num in l:
if check(num):
return num
return 0
3/19 2610. 转换二维数组
统计每个数出现的次数
找到最大值就是答案内的数组个数
每个数都在次数个数组中出现
def findMatrix(nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
m={}
for num in nums:
m[num]=m.get(num,0)+1
ans=[[]for _ in range(max(m.values()))]
for k in m.keys():
for i in range(m[k]):
ans[i].append(k)
return ans
3/20 2612. 最少翻转操作数
广搜 判断每一个能够到达的位置
对于位置i 能够到达的位置为max(i-k+1,k-i-1),min(i+k-1,2*n-k-i-1)
s中为按奇偶分的需要考虑的位置
def minReverseOperations(n, p, banned, k):
"""
:type n: int
:type p: int
:type banned: List[int]
:type k: int
:rtype: List[int]
"""
from collections import deque
from sortedcontainers import SortedList
s=[SortedList(),SortedList()]
ban=set(banned)
for i in range(n):
if i!=p and i not in ban:
s[i%2].add(i)
ans=[-1]*n
l=deque()
l.append(p)
ans[p]=0
while l:
i=l.popleft()
ml=max(i-k+1,k-i-1)
mr=min(i+k-1,2*n-k-i-1)
tset=s[mr%2]
nxt=[]
for v in tset.irange(ml,mr):
ans[v]=ans[i]+1
l.append(v)
nxt.append(v)
for v in nxt:
tset.remove(v)
return ans
3/21 2680. 最大或值
只对一个最高位的数进行k次操作最大
s为所有值的或值
mult 为某个位置出现两次及以上1的值
对于某个x的值 s异或x后与mult相或 即为出去x的其他所有数相或的值
def maximumOr(nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: int
"""
s,mult=0,0
for x in nums:
mult |= x&s
s|=x
ans = 0
for x in nums:
ans=max(ans,(s^x)|(mult)|(x<<k))
return ans
3/22 2643. 一最多的行
数值只有1和0 对每一行求和 和最大就是1最多
def rowAndMaximumOnes(self, mat):
"""
:type mat: List[List[int]]
:rtype: List[int]
"""
ans=[0,0]
for i in range(len(mat)):
v=sum(mat[i])
if v>ans[1]:
ans=[i,v]
return ans
3/23 2116. 判断一个括号字符串是否有效
记录状态值v
左括号+1 右括号-1
mx,mn分别为v可能的最大值最小值
如果最后最小值可以取到0 说明可以满足
def canBeValid(s, locked):
"""
:type s: str
:type locked: str
:rtype: bool
"""
if len(s)%2:
return False
mx,mn=0,0
for b,l in zip(s,locked):
if l=='1':
v = 1 if b=='(' else -1
mx+=v
if mx<0:
return False
mn+=v
else:
mx+=1
mn-=1
if mn<0:
mn=1
return mn==0