本文最后更新于 3 分钟前,文中所描述的信息可能已发生改变。
3643. 垂直翻转子矩阵 - 力扣(LeetCode)
解题思路
双指针,按题意交换子数组即可
示例代码
python
class Solution:
def reverseSubmatrix(self, grid: List[List[int]], x: int, y: int, k: int) -> List[List[int]]:
for i in range(k // 2):
grid[x + i][y: y + k], grid[x + k - i - 1][y: y + k] = grid[x + k - i - 1][y: y+k], grid[x + i][y: y + k]
return grid3644. 排序排列 - 力扣(LeetCode)
解题思路
贪心,找出下标与元素值不相等的元素相与即可,证明见参考
示例代码
python
class Solution:
def sortPermutation(self, nums: List[int]) -> int:
if nums[0]:
return 0
ans = -1
for i, x in enumerate(nums):
if i != x:
ans &= x
return max(ans, 0)3645. 最优激活顺序得到的最大总和 - 力扣(LeetCode)
解题思路
贪心或模拟,将数组排序,用堆模拟激活后活跃状态元素个数变化即可,或者用 limit[i] 分组,取limit[i]个最大值之和
示例代码
python
class Solution:
def maxTotal(self, value: List[int], limit: List[int]) -> int:
h = []
ans = 0
cnt = 0
li = [(y, x) for x, y in zip(value, limit)]
li.sort(key=lambda p: (p[0], -p[1]))
for y, x in li:
if cnt >= y:
continue
heappush(h, (y, x))
cnt = max(len(h), cnt)
while h and cnt >= h[0][0]:
heappop(h)
ans += x
return anspython
class Solution:
def maxTotal(self, value: List[int], limit: List[int]) -> int:
groups = defaultdict(list)
for lim, v in zip(limit, value):
groups[lim].append(v)
ans = 0
for lim, a in groups.items():
a.sort()
ans += sum(a[-lim:])
return ans3646. 下一个特殊回文数 - 力扣(LeetCode)
解题思路
预处理,枚举全排列,确保每个msk奇数个数小于 1,通过全排列生成回文数,一共 2296 个,然后主函数中二分查找即可
示例代码
python
def dfs(i, cnt, msk, odd):
global msks
if cnt == odd == 0:
msks.add(msk)
return
if i > 9 or cnt <= 0:
return
dfs(i + 1, cnt, msk, odd)
dfs(i + 1, cnt - i, msk | (1 << i), odd - i % 2)
return
msks = set()
for i in range(1, 17):
dfs(1, i, 0, i % 2)
digits = set()
for msk in msks:
odd = 0
perm = []
for i in range(msk.bit_length()):
if msk >> i & 1:
perm.extend([i] * (i // 2))
if i % 2:
odd = i
odd = str(odd) if odd else ''
for p in permutations(perm):
t = ''.join(map(str, p))
digits.add(int(t + odd + t[::-1]))
digits = sorted(digits)
class Solution:
def specialPalindrome(self, n: int) -> int:
idx = bisect_right(digits, n)
return digits[idx]