Leetcode刷题(统计参与通信的服务器、统计二叉树中好节点的数目、移动片段得到字符串、买卖股票的最佳时机含冷冻期、买卖股票的最佳时机③、全部开花的最早一天、打家劫舍)

目录

1、统计参与通信的服务器

2、统计二叉树中好节点的数目

3、移动片段得到字符串

4、买卖股票的最佳时机含冷冻期

5、买卖股票的最佳时机③

6、全部开花的最早一天

7、打家劫舍


1、统计参与通信的服务器

class Solution:
    def countServers(self, grid: List[List[int]]) -> int:
        m, n = len(grid), len(grid[0])          #统计grid二维数组
        rows = [0] * m              #定义行列数组统计每行的元素
        cols = [0] * n
        for i in range(m):       #遍历整个二维数组,只要有服务器的都加1
            for j in range(n):
                if grid[i][j] == 1:
                    rows[i] += 1
                    cols[j] += 1
        
        ans = 0
        for i in range(m):
            for j in range(n):
                if grid[i][j] == 1 and (rows[i] > 1 or cols[j] > 1):
                    ans += 1
        
        return ans

2、统计二叉树中好节点的数目

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def goodNodes(self, root: TreeNode) -> int:
        def dfs(root: TreeNode, mx: int):
            if root is None:
                return
            nonlocal ans     #局部函数内变量修改全局变量使用nonlocal
            if mx <= root.val:         #发现这个节点是好节点
                ans += 1
                mx = root.val     #修改值
            dfs(root.left, mx)
            dfs(root.right, mx)

        ans = 0  
        dfs(root, -1000000)     #将初始的mx设置为-1000000则保证了树的根节点一定是好节点
        return ans

3、移动片段得到字符串

class Solution:
    def canChange(self, start: str, target: str) -> bool:
        n = len(start)
        i = j = 0
        while 1:
            while i < n and start[i] == '_':
                i += 1
            while j < n and target[j] == '_':
                j += 1
            if i >= n and j >= n:
                return True
            if i >= n or j >= n or start[i] != target[j]:
                return False
            if start[i] == 'L' and i < j:
                return False
            if start[i] == 'R' and i > j:
                return False
            i, j = i + 1, j + 1

4、买卖股票的最佳时机含冷冻期

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        @cache
        def dfs(i: int, j: int) -> int:
            if i >= len(prices):
                return 0
            ans = dfs(i + 1, j)
            if j:
                ans = max(ans, prices[i] + dfs(i + 2, 0))
            else:
                ans = max(ans, -prices[i] + dfs(i + 1, 1))
            return ans

        return dfs(0, 0)

5、买卖股票的最佳时机③

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        # 第一次买入,第一次卖出,第二次买入,第二次卖出
        f1, f2, f3, f4 = -prices[0], 0, -prices[0], 0
        for price in prices[1:]:
            f1 = max(f1, -price)
            f2 = max(f2, f1 + price)
            f3 = max(f3, f2 - price)
            f4 = max(f4, f3 + price)
        return f4

6、全部开花的最早一天

class Solution:
    def earliestFullBloom(self, plantTime: List[int], growTime: List[int]) -> int:
        ans = days = 0
        for p, g in sorted(zip(plantTime, growTime), key=lambda z: -z[1]):
            days += p  # 累加播种天数
            ans = max(ans, days + g)  # 再加上生长天数,就是这个种子的开花时间
        return ans

7、打家劫舍

class Solution:
    def rob(self, nums: List[int]) -> int:
        n = len(nums)
        f = [0] * (n + 1)
        f[1] = nums[0]
        for i in range(2, n + 1):
            f[i] = max(f[i - 1], f[i - 2] + nums[i - 1])
        return f[n]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值