【华为OD机试真题 Python语言】1、滑动窗口最大值 | 机试真题+思路参考+代码解析

文章目录

    • 一、题目
      • 题目描述
      • 输入输出
      • 样例1
      • 样例2
      • 样例3
      • 样例4
      • 样例5
      • 样例6
      • 样例7
      • 样例8
      • 样例9
      • 样例10
      • 样例11
    • 二、思路参考
    • 三、问题解疑
      • 问题1:
      • 问题2:
        • 问题2代码演示
    • 四、代码参考
  • 作者:KJ.JK


个人博客首页: KJ.JK
 
专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用Python语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习


一、题目


题目描述

有一个N个整数的数组,和一个长度为M的窗口,窗口从数组内的第一个数开始滑动直到窗口不能滑动为止,
 
每次窗口滑动产生一个窗口和(窗口内所有数的和),求窗口滑动产生的所有窗口和的最大值


输入输出

输入
第一行输入一个正整数N,表示整数个数。(0 第二行输入N个整数,整数的取值范围为[-100,100]。
第三行输入一个正整数M,M代表窗口的大小,M<=100000,且M<=N。
 
输出
窗口滑动产生所有窗口和的最大值


样例1

输入
6
12 10 20 30 15 23
3


输出
68

说明

窗口长度为3,窗口滑动产生的窗口和分别为10+20+30=6020+30+15=6530+15+23=6815+23+12=50,

所以窗口滑动产生的所有窗口和的最大值为68

这里上面的原题是这样的描述,但感觉好像不是这样,所以重新模拟了一下窗口,说明:

滑动窗口和应该是不跨越数组边界的连续子数组的和。

所以,滑动窗口应该是这样的:

  • 第一个窗口:12 + 10 + 20 = 42
  • 第二个窗口:10 + 20 + 30 = 60
  • 第三个窗口:20 + 30 + 15 = 65
  • 第四个窗口:30 + 15 + 23 = 68

在数组内部连续地移动。


样例2

输入
5
1 2 3 4 5
3



输出
12

样例3

输入
7
-1 -2 -3 -4 -5 6 7
2




输出
13

样例4

输入
8
-5 4 -3 9 -1 0 5 -2
4




输出
13

样例5

输入
6
0 2 0 0 0 1
2




输出
2

样例6

输入
5
100 -100 100 -100 100
3




输出
100

样例7

输入
4
1 3 5 7
2



输出
12

样例8

输入
6
-5 -4 -3 -2 -1 0
3




输出
-3

样例9

输入
7
1 2 3 4 5 6 7
4



输出
22

样例10

输入
5
-2 3 -4 5 -6
2




输出
1

样例11

输入
6
1 -1 2 -2 3 -3
3




输出
3

二、思路参考


给定一个长度为N的数组和窗口大小M,我们需要找到滑动窗口产生的所有窗口和的最大值。

我们可以使用滑动窗口的技巧来解决这个问题。首先,我们计算数组的前M个元素的和,作为初始窗口和的值。然后,我们从第M+1个元素开始,每次向右移动一个位置,同时更新窗口和的值。

具体步骤如下:

1、输入数组的长度N和数组元素

2、输入窗口大小M

3、计算初始窗口和的值,即数组的前M个元素的和

4、初始化一个变量max_sum为初始窗口和的值

5、从第M+1个元素开始,进行以下循环:

   窗口和的值减去滑出窗口的第一个元素,加上滑入窗口的下一个元素,更新窗口和的值
   如果当前窗口和的值大于max_sum,则更新max_sum为当前窗口和的值

6、输出max_sum作为结果


三、问题解疑


问题1:

❓Q1:按照题目的要求 15+23+12这个窗口是不能出现的吧
 
⭕A1:滑动窗口和应该是不跨越数组边界的连续子数组的和。
 
所以,滑动窗口应该是这样的:

  • 第一个窗口:12 + 10 + 20 = 42
  • 第二个窗口:10 + 20 + 30 = 60
  • 第三个窗口:20 + 30 + 15 = 65
  • 第四个窗口:30 + 15 + 23 = 68
     
    应该是原题目的案例描述不对,这里进行补充说明

问题2:

❓Q1:这个可以不要map函数吗?
 
⭕A1:可以不使用 map 函数,map 函数的作用是将输入的字符串转换为整数列表,如果不使用 map,需要手动遍历输入的字符串并将其转换为整数


问题2代码演示
# 获取整数个数N
N = int(input())
# 获取整数数组arr的字符串形式,然后分割成字符串列表
arr_str = input().split()
# 手动将字符串列表转换为整数列表
arr = [int(x) for x in arr_str]
# 获取窗口大小M
M = int(input())

# 初始化窗口和为窗口的前M个数的和
window_sum = sum(arr[:M])
# 初始化最大和为窗口的和
max_sum = window_sum

# 从第M个数开始遍历数组
for i in range(M, N):
    # 窗口和等于上一个窗口和减去窗口第一个数再加上当前数
    window_sum = window_sum - arr[i - M] + arr[i]
    # 更新最大和
    max_sum = max(max_sum, window_sum)

# 输出最大和
print(max_sum)


四、代码参考

# 获取整数个数N
N = int(input())
# 获取整数数组arr
arr = list(map(int, input().split()))
# 获取窗口大小M
M = int(input())

# 初始化窗口和为窗口的前M个数的和
window_sum = sum(arr[:M])
# 初始化最大和为窗口的和
max_sum = window_sum

# 从第M个数开始遍历数组
for i in range(M, N):
    # 窗口和等于上一个窗口和减去窗口第一个数再加上当前数
    window_sum = window_sum - arr[i - M] + arr[i]
    # 更新最大和
    max_sum = max(max_sum, window_sum)

# 输出最大和
print(max_sum)



作者:KJ.JK

你可能感兴趣的:(B+C+D+E卷,华为od,python,算法,华为OD机试真题,滑动窗口最大值)