基础算法(Leetcode)刻意练习训练营:第六天打卡

今天的题目是123. 买卖股票的最佳时机 III

说实话没学动态规划和深度搜索,完全不会做,看了题解,等周末再好好吸收巩固。

class Solution:
    def maxProfit(self, prices: List[int]) -> int:
        if not prices:
            return 0
        dpI0 = [0] * 3
        dpI1 = [float('-INF')] + [- prices[0]] * 2 
        for i in range(1, len(prices)):
            for k in range(1, 3):
                dpI0[k] = max(dpI0[k], dpI1[k] + prices[i])
                dpI1[k] = max(dpI1[k], dpI0[k - 1] - prices[i])
        return dpI0[2]

Your runtime beats 68.97 % of python3 submissions
Your memory usage beats 62.61 % of python3 submissions (14.2 MB)

今天力扣的每日一题:1103. 分糖果 II

看了下题,没啥特别思路就用了暴力法。

class Solution:
    def distributeCandies(self, candies: int, num_people: int) -> List[int]:
    	# 根据人数初始化一个全0数组
        list = [0] * num_people
        # 当前人应该发的糖的数量
        cnt = 1
        # 循环直到分完
        while candies != 0:
        	# 根据人数循环
            for i in range(num_people):
            	# 轮到的人拿对应的糖
                list[i] += min(cnt, candies)
                # 糖总数减去刚发的
                candies -= min(cnt, candies)
                # 应发数量 + 1
                cnt += 1
        return list

执行用时 :60 ms, 在所有 Python3 提交中击败了22.05%的用户
内存消耗 :13.4 MB, 在所有 Python3 提交中击败了23.58%的用户

看了下题解,还有个等差数列的解法。确实快很多,就是代码比较长,也不太好理解

class Solution:
    def distributeCandies(self, candies: int, num_people: int) -> List[int]:
        if num_people == 1:
            return [candies]

        max_candies = self.get_max_candies(candies)
        max_distribute_num = max_candies // num_people
        if max_distribute_num == 0:
            return self.distribute_last_time(num_people, max_distribute_num, candies, [0] * num_people)
        first_start = (1 + (max_distribute_num * num_people + 1)) * (max_distribute_num + 1) // 2 - (max_distribute_num * num_people + 1)
        result = [i for i in range(first_start, first_start + num_people * max_distribute_num, max_distribute_num)]
        remain = candies - (result[0] + result[-1]) * num_people // 2
        return self.distribute_last_time(num_people, max_distribute_num, remain, result)

    def get_max_candies(self, candies):
        return int((-1 + (1 + 8 * candies) ** 0.5) / 2)

    def distribute_last_time(self, num_people, max_distribute_num, remain, result):
        last_line_point = max_distribute_num * num_people + 1
        for i in range(num_people):
            if remain > last_line_point:
                result[i] += last_line_point
                remain -= last_line_point
                last_line_point += 1
            else:
                result[i] += remain
                break
        return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值