当前位置: 首页 > article >正文

图解算法数据结构-LeetBook-栈和队列04_望远镜中最高的海拔_滑动窗口

科技馆内有一台虚拟观景望远镜,它可以用来观测特定纬度地区的地形情况。该纬度的海拔数据记于数组 heights ,其中 heights[i] 表示对应位置的海拔高度。请找出并返回望远镜视野范围 limit 内,可以观测到的最高海拔值。

示例 1:
输入:heights = [14,2,27,-5,28,13,39], limit = 3
输出:[27,27,28,28,39]
解释:
滑动窗口的位置 最大值


[14 2 27] -5 28 13 39 27
14 [2 27 -5] 28 13 39 27
14 2 [27 -5 28] 13 39 28
14 2 27 [-5 28 13] 39 28
14 2 27 -5 [28 13 39] 39

提示:
你可以假设输入总是有效的,在输入数组不为空的情况下:
1 <= limit <= heights.length
-10000 <= heights[i] <= 10000

解法一

从头到尾遍历每个状态的窗口

class Solution {
public:
    vector<int> maxAltitude(vector<int>& heights, int limit) {
        vector<int> res;
        if(heights.empty()) return res;
        int max_;
        for(int i = 0;i <= int(heights.size())-limit;i++){
            max_ = heights[i];
            for(int j = 1;j < limit;j++){
                if(heights[i+j] > max_) max_ = heights[i+j];
            }
            res.push_back(max_);
        }
        return res;
    }
};

解法一

解法二

上一个方法显然有很多冗余的比较,比如

7 2 8 10
3

滑动到第二个状态的时候,因为8所在的位置在窗口左侧的右边,所以只需要将新加入的10和8(之前的最大值)比较

8 2 6 4
3

滑动到第二个状态的时候,因为8所在的位置在窗口左侧,所以需要重新在新窗口中找最大值
基于以上思想

class Solution {
public:
    vector<int> maxAltitude(vector<int>& heights, int limit) {
        vector<int> res;
        if(heights.empty()) return res;
        if(limit == 1) return heights;
        int len = heights.size(), pre_max_index = 0, max_ = heights[0];
        //计算第一个max
        for(int i = 0;i < limit;i++){
            if(heights[i] > max_){
                max_ = heights[i];
                pre_max_index = i;
            } 
        }
        res.push_back(max_);

        for(int i = 1;i <= len-limit;i++){
            if(i < pre_max_index){
                //如果这次窗口左侧在之前最大值的索引左侧(不包括之前最大值的索引)
                //只需要比较新加入的值和之前最大值
                if(heights[i+limit-1] > max_){
                    max_ = heights[i+limit-1];
					pre_max_index = i+limit-1;
                }
                res.push_back(max_);
            } else {//重新开始一个最大值,默认值为heights[i]
                int temp = limit;
                max_ = heights[i];
                pre_max_index = i;
                while(temp--){
                    if(heights[i+temp] > max_){
                        pre_max_index = i+temp;
                        max_ = heights[i+temp];
                    }
                }
                res.push_back(max_);
            }
        }
        return res;
    }
};

当然,如果limit为1,根本就不需要计算直接返回就行。
新加入的值: h e i g h t s [ i + l i m i t − 1 ] heights[i+limit-1] heights[i+limit1]
解法二


http://www.kler.cn/a/137230.html

相关文章:

  • Hutool工具包的常用工具类的使用介绍
  • Windows server 服务器网络安全管理之防火墙出站规则设置
  • 常用es命令
  • 详解 Qt WebEngine 模块
  • aioice里面candidate固定UDP端口测试
  • 智能工厂的设计软件 三种处理单元(NPU/GPU/CPU)及其在深度学习框架中的作用 之4(百度文库答问 之2)
  • uview-plus中二级菜单左右联动更改为uni-app+vue3+vite写法
  • docker-compose安装harbor
  • yum仓库
  • 短视频账号矩阵系统saas管理私信回复管理系统
  • hdfsClient_java对hdfs进行上传、下载、删除、移动、打印文件信息尚硅谷大海哥
  • 活动回顾 | 数字外贸私享会【上海站】成功举办
  • redis---非关系型数据库
  • Vue 中简易封装网络请求(Axios),包含请求拦截器和响应拦截器
  • 如何优雅的避免空指针异常
  • SQL优化——如何写出高效率SQL
  • 如何在 ASP.NET Core 中使用 Quartz.NET
  • 哈希的应用——位图
  • 【shell脚本】全自动完成pxe无人值守批量装机脚本,匹配centos系列
  • Unity中Shader法线贴图(下)实现篇
  • 拉链表-spark版本
  • Python等于号标红怎么办,可能原因
  • React 自定义hook 之 防抖和节流
  • 很多人都在用的现货白银突破交易法 缺点需要注意
  • Qt Widget 自定义TitleBar带阴影窗口
  • 3PC(三阶段提交)