LeetCode:每日一题【第五周】

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

猜你喜欢

转载自blog.csdn.net/qq_45249273/article/details/126577396
今日推荐