碎碎念
这应该是一两天前的,但因为那几天忙碌就没有记下来了。这一题可难可简单,我是先用了笨方法然后吃到超时,然后请GPT改成快一点的方法(蛮猛的)
提案
这题也是阅读测验题,给定list,找出饱含指定索引k的元素的最高分的子阵列
最高分的定义="子序列的长度(len(array))"乘以"子序列的最小元素(min(array))"
这个大概看範例就懂了
解题丝路
我的原始做法是跑一个双层迴圈,一次向左,一次向右,然后就可以跑完所有的array可能性
‵‵‵class Solution: def maximumScore(self, nums: list[int], k: int) -> int: max_product = -1 # 初始化为-1,因为我们处理的是正整数 n = len(nums) haha = 0 for start in range(0, k + 1): # start不应超过k for end in range(k, n): # end至少需要从k开始 sublist = nums[start:end + 1] current_product = min(sublist) * len(sublist) max_product = max(max_product, current_product) print(sublist) return max_product
但花的时间太多了,可是我又非得把所有的都历遍过
于是我就叫AI
class Solution: def maximumScore(self, nums: list[int], k: int) -> int: max_product = nums[k] # 初始化为 nums[k],因为我们处理的是正整数,nums[k] 是有效子序列的一部分 min_value = nums[k] # 当前的最小值初始化为 nums[k] left = right = k # 从索引 k 开始向两边扩展 while left > 0 or right < len(nums) - 1: # 当左边或右边有更多元素时继续 # 如果左边没有更多元素,或者右边的元素更大,则向右移动 if left == 0 or (right < len(nums) - 1 and nums[left - 1] < nums[right + 1]): right += 1 min_value = min(min_value, nums[right]) else: # 否则,向左移动 left -= 1 min_value = min(min_value, nums[left]) current_product = min_value * (right - left + 1) # 计算当前子序列的乘积 max_product = max(max_product, current_product) # 更新最大乘积 return max_product
他用if直接左右扩,然后就过了
我对于记忆体跟时间消耗的部分不是很懂啦
为甚么这样比较快呢???