最大最小值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)