图解算法数据结构-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]
解法二

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/171928.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI技术实力认证,宏电股份荣获2023年度AI天马“领军企业”

近日&#xff0c;由中国新一代人工智能发展战略研究院指导&#xff0c;深圳市人工智能产业协会主办&#xff0c;广东未来产业研究院承办的2023年度“AI天马”认定最终结果公布&#xff0c;宏电股份荣获AI天马“领军企业”奖项。 宏电股份基于20余年的技术沉淀&#xff0c;在工业…

【OpenGauss 列存储学习总结 2】

OpenGauss 列存储学习总结 2 概述文章链接 概述 列存储是一种优化技术&#xff0c;用于在数据库系统中存储和查询大量数据。与传统的行存储方式不同&#xff0c;列存储将每个列的数据分别存储在独立的存储单元中&#xff0c;而不是按照行的方式存储。这种存储方式在分析性查询、…

Java GUI实现桌球小游戏

桌球游戏是一种室内运动&#xff0c;通常在一个正式的桌球台上进行。这种游戏也被称为台球或母球。桌球游戏的目标是使用一个击球杆将彩球击入桌面四个角落的袋子中&#xff0c;得分最高的一方获胜。桌球游戏需要一定的技巧和策略&#xff0c;因此是一项受欢迎的竞技运动和休闲…

Vue:[##################] / reify:core-js: timing reifyNode:node_modules/lodash Completed in 4923ms

Vue创建项目卡在[##################] / reify:core-js: timing reifyNode:node_modules/lodash Completed in 4923ms不动的问题. 遇到问题不要慌&#xff0c;别人可以你也可以。 1.什么是npm npm是node官方的包管理器。 cnpm是个中国版的npm&#xff0c;是淘宝定制的 cnpm (g…

第2关:图的深度优先遍历

任务要求参考答案评论2 任务描述相关知识编程要求测试说明 任务描述 本关任务&#xff1a;以邻接矩阵存储图&#xff0c;要求编写程序实现图的深度优先遍历。 相关知识 图的深度优先遍历类似于树的先序遍历, 是树的先序遍历的推广&#xff0c;其基本思想如下&#xff1a; …

广西梧州盾构机主轴承尺寸测量检测CAV检测上门三维扫描-CASAIM中科广电

一、背景介绍 大型盾构机在掘进过程中&#xff0c;只能前进&#xff0c;不能倒退&#xff0c;盾构机掘进过程中&#xff0c;主轴承“手持”刀盘旋转切削掌子面并为刀盘提供旋转支撑&#xff0c;主轴承一旦失效&#xff0c;会造成严重损失。因此&#xff0c;主轴承是盾构机刀盘…

软件系统运维方案

1.项目情况 2.服务简述 2.1服务内容 2.2服务方式 2.3服务要求 2.4服务流程 2.5工作流程 2.6业务关系 2.7培训 3.资源提供 3.1项目组成员 3.2服务保障 点击获取所有软件开发资料&#xff1a;点我获取

PHP中cookie与session使用指南

PHP中cookie与session使用指南 Cookie和session的出现&#xff0c;是为了解决http协议无状态交互的窘境&#xff0c;它们都用于存储客户端的相关信息 0x01 Cookie使用 简介 Cookie 是一种在客户端存储数据的机制&#xff0c;通常用于记录用户的状态和偏好。下面将介绍如何在…

软件测试最重要的事:测试用例的编写

前言 软件测试用例得出软件测试用例的内容&#xff0c;其次&#xff0c;按照软件测试写作方法&#xff0c;落实到文档中&#xff0c;两者是形式和内容的关系&#xff0c;好的测试用例不仅方便自己和别人查看&#xff0c;而且能帮助设计的时候考虑的更周。 一个好的测试用例必…

企业app软件定制开发的重点是什么?|小程序网站搭建

企业app软件定制开发的重点是什么&#xff1f;|小程序网站搭建 在当今数字化时代&#xff0c;企业对于信息技术的依赖越来越大。为了适应市场需求并提高内部运营效率&#xff0c;许多企业开始寻求定制开发企业app软件。这种定制开发可以根据企业的具体需求和业务流程进行个性化…

DITTEL控制器维修SENSITRON6-2AE

DITTEL工控产品维修包括&#xff1a;德国DITTEL平衡测试仪维修,DITTEL模块&#xff0c;过程监控模块&#xff0c;DITTEL控制器&#xff0c;平衡头&#xff0c;机电平衡头&#xff0c;显示器&#xff0c;平衡系统等产品。 DITTEL过程控制模块维修 DM6000是一个过程控制模块&…

5分钟带你了解什么是原型图!

原型图&#xff0c;亦称原型设计稿&#xff0c;在软件研发流程中是非常基础和重要的一类设计项目。而对于产品经理、交互设计师以及产品运营等职业群体来说&#xff0c;原型设计则是一门不可或缺的技能。并且&#xff0c;原型设计也是一门有门槛、有规范的工作。 什么是原型图…

【通俗易懂】git原理、安装及连接gitlab,github

目录 一、GIT原理【这部分也挺简单&#xff0c;可以看看&#xff0c;如果没时间可以直接跳到第二部分】 SVN与Git的的区别 二、安装Git 2.1 获取Git安装程序 2.2 Git安装过程 三、Git连接Gitlab 3.1 gitlab准备工作 3.2 本地计算机准备工作及配置git 四、Git连接Github…

【EI会议征稿】第七届电子器件与机械工程国际学术会议(ICEDME 2024)

第七届电子器件与机械工程国际学术会议&#xff08;ICEDME 2024&#xff09; 2024 7th International Conference on Electron Device and Mechanical Engineering 第七届电子器件与机械工程国际学术会议&#xff08;ICEDME 2024&#xff09;将于2024年3月15-17日在山西太原召…

Sui生态多家协议上线流动质押,兼顾收益与灵活性

在Sui上&#xff0c;流动质押协议允许DeFi用户质押SUI&#xff0c;并获得可交易或用于其他DeFi活动的流动质押标记token。这一过程绕过了传统质押中验证节点锁定token的问题。用户可以通过Sui的权益证明机制&#xff08;PoS&#xff09;确保网络的安全&#xff0c;同时参与生态…

微波功率计/频率计-87234系列USB峰值/平均功率计

仪器仪表 苏州新利通 87234系列 USB峰值/平均功率计 频率范围覆盖&#xff1a;50MHz&#xff5e;67GHz 一款基于USB 2.0接口的二极管检波式宽带功率测量仪器 国产思仪功率计 01 产品综述 87234D/E/F/L USB峰值/平均功率计是一款基于USB 2.0接口的二极管检波式宽带功率测…

GNSS技术在交通运输领域的创新应用

全球导航卫星系统&#xff08;GNSS&#xff09;技术在交通运输领域发挥着越来越重要的作用&#xff0c;为汽车导航、航空、海运等交通模式提供了精准的定位和导航服务。本文将深入探讨GNSS技术在交通运输领域的应用&#xff0c;以及它对交通管理、安全性和效率的积极影响。 一、…

嵌入式开发、C++后台开发、C++音视频开发怎么选择?

嵌入式开发、C后台开发、C音视频开发怎么选择&#xff1f; 在日常生活中&#xff0c;视频类应用占据了我们越来越多的时间&#xff0c;各大公司也纷纷杀入这个战场&#xff0c;不管是抖音、快手等短视频类型&#xff0c;虎牙、斗鱼等直播类型&#xff0c;腾讯视频、爱奇艺、优酷…

vue中使用echarts渐变柱状图 Cannot read properties of undefined (reading ‘graphic‘)解决方法

在使用渐变颜色时报错&#xff0c;Cannot read properties of undefined (reading ‘graphic’) echarts也下载了&#xff0c;引入了&#xff0c;就是报错&#xff0c;用不了new charts&#xff0c; 结果换了一个版本号就可以了&#xff0c;本来用的"echarts": "…

机器学习介绍与分类

随着科学技术的不断发展&#xff0c;机器学习作为人工智能领域的重要分支&#xff0c;正逐渐引起广泛的关注和应用。本文将介绍机器学习的基本概念、原理和分类方法&#xff0c;帮助读者更好地理解和应用机器学习技术。 一、机器学习的基本概念 机器学习是一种通过从数据中学…