最大最小值python3解法

最大最小值python3解法@TOC

最大最小值

题目:

小易给定了一个长度为n的数字序列,对于每一个,小易希望能求解出所有长度为k的连续子序列的最大值中的最小值。

输入描述:

第一行数字n 
接下来一行是一个长度为n的数字序列,

输出描述:

一行n个数字,第i个数字表示k = i时的答案。

输入例子1:

6
1 3 2 4 6 5

输出例子1:

1 3 3 4 6 6

例子说明:

当k = 2的时候
子序列分别是:
1 3 最大值为 3
3 2 最大值为 3
2 4 最大值为 4
4 6 最大值为 6
6 5 最大值为 6
所有最大值中的最小值为3

法一:暴力解

主要参考网易手撕代码

n = int(input())
nums = list(map(int,input().split()))
result = []
for i in range(1,n+1):
    num = []
    for j in range(n-i+1):
        num.append(max(nums[j:j+i]))
    result.append(min(num))
print(' '.join(map(str,result)))

case通过30%

法二:动态规划

(主要参考leetcode中的滑动窗口最大值一题)

class Solution:
    def maxSlidingWindow(self, nums, n):
        n = len(nums)
        if n == 0:
            return ''
        if n == 1:
            return nums
        left = [0] * n
        left[0] = nums[0]
        right = [0]*n
        right[n-1] = nums[n-1]
        
        result = []
        for k in range(1,n+1):
            for i in range(1, n):
            # from left to right
                if i % k == 0:
                # block start
                    left[i] = nums[i]
                else:
                    left[i] = max(left[i - 1], nums[i])
            #从右到左
                j = n-i-1
                if (j + 1) % k == 0:
                # block end
                    right[j] = nums[j]
                else:
                    right[j] = max(right[j + 1], nums[j])
            output = []
            for i in range(n-k+1):
                output.append(max(left[i+k-1],right[i]))
            result.append(min(output))
        return ' '.join(map(str,result))
if __name__ == '__main__':
    nums = [1,3,2,4,6,5]
    n = 6
    x = Solution()
    y = x.maxSlidingWindow(nums,n)
    print(y)

牛客网中case60%,希望哪位大佬可以帮忙优化
leetcode中的滑动窗口最大值题

主要希望看到的大佬可以分享下case100%的代码,万分感谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值