1470. 重新排列数组【简单模拟】
8.29
思路
略
AC代码
class Solution:
def shuffle(self, nums: List[int], n: int) -> List[int]:
ans = [0] * (2 * n)
pos = 0
i, j = 0, n
while i < n and j < 2 * n:
ans[pos] = nums[i]
pos += 1
ans[pos] = nums[j]
pos += 1
i += 1
j += 1
return ans
998. 最大二叉树 II
没读懂题
946. 验证栈序列
思路
将pushed里的元素压入栈(列表模拟栈)中,之后每次压入栈后,判断栈顶是否与poped相同,若相同继续弹出栈,poped往后移,最后判断栈是否为空。
AC代码
class Solution:
def validateStackSequences(self, pushed: List[int], popped: List[int]) -> bool:
stack = []
pos = 0
for x in pushed:
stack.append(x)
while stack and stack[-1] == popped[pos]:
pos += 1
stack.pop()
return len(stack) == 0
1475. 商品折扣后的最终价格【简单题】
思路
直接遍历
AC代码
class Solution:
def finalPrices(self, prices: List[int]) -> List[int]:
n = len(prices)
for i in range(n):
for j in range(i + 1, n):
if prices[j] <= prices[i]:
prices[i] -= prices[j]
break
return prices
687. 最长同值路径【DFS】
思路
记录某个节点的左子树和该节点相同的连续节点有多少个,右子树与该节点连续的节点有多少个,将两者相加统计最大值即可。
- 从最低层开始算,如果该节点为空,返回0,如果有节点,且和该节点值相同,该节点的最长同值路径等于左节点的最长同值路径+1,与右节点最长同值路径+1,取最大值。
- 从最底层开始,就要用到递归,用dfs求解
AC代码
class Solution:
def longestUnivaluePath(self, root: Optional[TreeNode]) -> int:
ans = 0
# 从树的低端往上遍历,下面算过的值直接用
def dfs(node: Optional[TreeNode]) -> int:
if not node:
return 0
left = dfs(node.left)
right = dfs(node.right)
l = left + 1 if node.left and node.val == node.left.val else 0
r = right + 1 if node.right and node.val == node.right.val else 0
nonlocal ans # 将该函数作为非局部遍历
ans = max(ans, l + r)
return max(l , r)
dfs(root)
return ans
646. 最长数对链【暴力or贪心】
思路
将数对按照第二位排序,之后暴力找最长数对链。
AC代码
class Solution:
def findLongestChain(self, pairs: List[List[int]]) -> int:
pairs = sorted(pairs, key=lambda pair: pair[1])
ans = 0
n = len(pairs)
for i, pair in enumerate(pairs):
tmp = 1
j = i
k = i + 1
while j < n and k < n:
if pairs[j][1] < pairs[k][0]:
tmp += 1
j = k
k += 1
else:
k += 1
ans = max(ans, tmp)
return ans
思路【贪心】
还是将数对排序,然后用一个变量作为当前变量,如果小于数对的第一个数,把这个变量变成数对的第二个数,同时把答案数+1。这样用一层for就可以把答案找出来。
AC代码
class Solution:
def findLongestChain(self, pairs: List[List[int]]) -> int:
pairs = sorted(pairs, key=lambda pair: pair[1])
cur, ans = -inf, 0
for pair in pairs:
if cur < pair[0]:
cur = pair[1]
ans += 1
return ans
1582. 二进制矩阵中的特殊位置【Numpy切片】
思路
本题数据量小,可暴力做,判断该位置是否为1,如果不是则继续遍历,如果是通过切片计算该位置的行和列的和是否为1.
AC代码
import numpy as np
class Solution:
def numSpecial(self, mat: List[List[int]]) -> int:
ans = 0
n, m = len(mat), len(mat[0])
mat = np.array(mat)
for i in range(n):
for j in range(m):
if mat[i][j] == 1 and sum(mat[i, :]) == 1 and sum(mat[:, j]) == 1:
ans += 1
return ans