华为机试:滑动窗口最大值

news/2024/5/20 9:45:18 标签: 算法, 滑动窗口, 华为机试, 栈和队列

【编程题目 | 100分】滑动窗口最大值 [ 2022 Q1 考试题 ]

本题可使用本地IDE编码,不能使用本地已有代码。无跳出限制,编码后请点击"保存并提交"按钮进行代码提交。

题目描述:

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

输入描述:

  • 第一行输入一个正整数N,表示整数个数。(0<N<100000)
  • 第二行输入N个整数,整数的取值范围为[-100,100]。
  • 第三行输入一个正整数M,M代表窗口的大小,M<=100000,且M<=N。

输出描述:

  • 窗口滑动产生所有窗口和的最大值。

示例 1 输入输出示例仅供调试,后台判题数据一般不包含示例

输入

6
12 10 20 30 15 23
3

输出

68

思路分析:

这与leetcode的滑动窗口最大值不同,那个需要用单调栈来实现。计算每个窗口的最大值。

这道题可以参考单调栈实现方法,用来统计滑动窗口的最大值。也可以使用双指针来实现。

参考代码:

Java实现:

1. 双端队列

import java.util.LinkedList;
import java.util.Scanner;

public class maxSlidingWindow {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        in.nextLine();

        String[] s = in.nextLine().split(" ");
        for (int i = 0; i < s.length; i++) {
            nums[i] = Integer.parseInt(s[i]);
        }
        int k = in.nextInt();
        int res = 0;
        // 双端队列实现
        int ans = 0;
        LinkedList<Integer> queue = new LinkedList<>();
        for (int i = 0; i < n; i++) {
            // 添加当前值对应的数组下标,计算当前窗口和
            queue.add(i);
            ans += nums[i];
            // 初始化窗口,等到窗口长度为k时,下次移动时删除过期数值
            if (queue.getLast() >= k) {
                ans -= nums[queue.getFirst()];
                queue.removeFirst();
            }
            // 窗口长度为k时,后更新所有窗口的最大值
            if (i - k + 1 >= 0) {
                res = Math.max(ans, res);
            }
        }
        System.out.println(res);
    }
}

2. 双指针

import java.util.Scanner;

public class maxSlidingWindow {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[] nums = new int[n];
        in.nextLine();

        String[] s = in.nextLine().split(" ");
        for (int i = 0; i < s.length; i++) {
            nums[i] = Integer.parseInt(s[i]);
        }
        int k = in.nextInt();
        int res = 0;

        // 双指针
        int left = 0, sum = 0;
        for (int right = 0; right < n; right++) {
            sum += nums[right];
            while (left <= right && right - left + 1 >= k) {
                res = Math.max(res, sum);
                sum -= nums[left++];
            }
        }
        System.out.println(res);
    }
}

http://www.niftyadmin.cn/n/1727738.html

相关文章

华为机试:TLV解析Ⅰ

【编程题目 | 100分】TLV解析Ⅰ [ 100 / 中等 ] TLV解析Ⅰ 题目描述&#xff1a; TLV 编码是按 [ Tag Length Value ] 格式进行编码的&#xff0c;一段码流中的信元用Tag标识&#xff0c; Tag在码流中 唯一不重复 &#xff0c;Length表示信元Value的长度&#xff0c;Value表…

华为机试:VLAN资源池

【编程题目 | 100分】VLAN资源池 [ 100 / 中等 ] VLAN资源池 题目描述&#xff1a; VLAN是一种对局域网设备进行逻辑划分的技术&#xff0c;为了标识不同的VLAN&#xff0c;引入VLAN ID(1-4094之间的整数)的概念。 定义一个VLAN ID的资源池(下称VLAN资源池)&#xff0c;资源…

Electron 系统托盘图标

一、在入口文件electron.js中引入Tray, Menu, nativeImage const { app, BrowserWindow, Tray, nativeImage, Menu, ipcMain } require(electron); 二、在初始化完成后添加图片 app.whenReady().then(() > { //上面创建窗体代码省略 let mainWindow createWindow()cons…

华为机试:字符串统计(全量和占用字符集)

【编程题目 | 100分】字符串统计&#xff08;全量和占用字符集&#xff09; [ 100 / 简单 ] 字符串统计&#xff08;全量和占用字符集&#xff09; 题目描述&#xff1a; 给定两个字符集合&#xff0c; 一个是全量字符集&#xff0c; 一个是已占用字符集&#xff0c; 已占用…

华为机试:无重复字符的元素长度乘积的最大值

【编程题目 | 100分】无重复字符的元素长度乘积的最大值 [ 100 / 简单 ] 无重复字符的元素长度乘积的最大值 题目描述&#xff1a; 给定一个元素类型为小写字符串的数组&#xff0c;请计算两个没有相同字符的元素长度乘积的最大值。如果没有符合条件的两个元素返回0。 输入…

华为机试:非严格递增连续数字序列

【编程题目 | 100分】非严格递增连续数字序列 [ 100 / 简单 ] 非严格递增连续数字序列 题目描述&#xff1a; 输入一个字符串仅包含大小写字母和数字&#xff0c;求字符串中包含的最长的非严格递增连续数字序列的长度&#xff08;比如12234属于非严格递增连续数字序列&#…

华为机试高频题目(Java实现)

华为机试中出现的高频算法题目的一个汇总。 说明&#xff1a; OJ模式下的输入输出。代码是Java实现。 首先对于华为机试的OJ输入输出需要熟练&#xff0c;可以参考&#xff1a; ACM&#xff08;OJ&#xff09;模式下对于各种输入输出情况的总结&#xff08;JAVA&#xff09…

华为机试:矩阵最大值

【编程题目 | 100分】矩阵最大值 [ 100 / 中等 ] 矩阵最大值 题目描述&#xff1a; 给定一个仅包含0和1的N*N二维矩阵&#xff0c;请计算二维矩阵的最大值&#xff0c;计算规则如下&#xff1a; 每行元素按下标顺序组成一个二进制数&#xff08;下标越大越排在低位&#xf…