今天的题目是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