30天Leetcode挑战(6):1793 Maximum score of a good subarray

碎碎念

这应该是一两天前的,但因为那几天忙碌就没有记下来了。这一题可难可简单,我是先用了笨方法然后吃到超时,然后请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直接左右扩,然后就过了
我对于记忆体跟时间消耗的部分不是很懂啦
为甚么这样比较快呢???


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章