华为OD机试真题练习01:滑动窗口最大和

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

输入描述:
第一行输入一个正整数N,表示整数个数。(0<N<100000)

第二行输入N个整数,整数的取值范围为[-100,100]。

第三行输入一个正整数MM代表窗口大小,M<=100000,且M<=N。

输出描述:
窗口滑动产生的所有窗口和的最大值。

* 输入
 *
 * 6
 *
 * 10 20 30 15 23 12
 *
 * 3
 *
 * 输出
 *
 * 68
 *
 * 说明
 *
 * 窗口长度为3,窗口滑动产生的窗口和分别为10+20+30=6020+30+15=6530+15+23=6815+23+12=50*
 * 所以窗口滑动产生的所有窗口和的最大值为68

题解思路:想了好久,大体思路是计算滑动的前后差,后来者值大说明整体最大值是增加的,后来者居上嘛,此时赋值给最大值(上一次的最大值+两次滑动的差值)。

/**6
     * 10 20 30 15 23 12
     * 3
     * 计算滑动的前后差
     * 先算出滑动前的值--》暂且为最大值
     * 10+20+30
     *
     * 然后滑第一次--》和滑前的区别在于10和15--》如果后来者的值比之前的值大diff=15-10=5>0--》最大值要易主了--》此时最大值为滑动前的值60+5=65
     * 0+20+30+15
     *
     * 第二次--》和第一次的差别在于20和23--》23-20=3>0-->最大值变成65+3=68
     * 0+0+30+15+23
     *
     * 第三次--》和第2次的差别在于30和12--》12-30<0-->最大值还是上次的68
     * 0+0+0+15+23+12
     * @param args
     */
public static void main(String[] args) {
         Scanner scanner = new Scanner(System.in);

         //一共输入正整数数量
         String line = scanner.nextLine();
         int num = Integer.parseInt(line);


         //数据,字符串数组,可为负数
         String nextLine = scanner.nextLine();
         String[] split = nextLine.split(" ");
         //System.out.println(Arrays.toString(split));
         //变成整形数组
         int[] ints = new int[num];
         for (int i = 0; i < num; i++) {
             ints[i] = Integer.parseInt(split[i]);
         }
         //System.out.println(Arrays.toString(ints));

         //窗口长度
         String s = scanner.nextLine();
         int win = Integer.parseInt(s);
         //如果长度为0--》不滑了--》最大值为0--》直接返回0
         if (win == 0){
             System.out.println(0);
         }

         //初始化窗口和最大值
         int maxSum=0;

         for (int i = 0; i < win; i++) {
             //先算原始没滑动前的值
             maxSum += ints[i];
         }

         for (int i = win; i < num; i++) {
             //15-10>0-->说明最大值要改变了
             int diff = ints[i] - ints[i-win];
             //两次滑动之前的差别在于第一个数和最后一个数,中间的值是不变的--》如果滑动后一次的数-滑动前一次的值大于0--》说明整体最大值是增加的--》最大值=上一次的最大值+两次滑动的差值
             if (diff > 0){
                 //maxsum = maxsum + diff
                 //60+5
                 //65+3
                 maxSum += diff;
             }
         }
         System.out.println(maxSum);
     }

输入:
2
-10 2
2
输出:
-8

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lynn Lu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值