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

【数据结构和算法】找到最高海拔

其他系列文章导航

Java基础合集
数据结构与算法合集

设计模式合集

多线程合集

分布式合集

ES合集


文章目录

其他系列文章导航

文章目录

前言

一、题目描述

二、题解

2.1 前缀和的解题模板

2.1.1 最长递增子序列长度

2.1.2 寻找数组中第 k 大的元素

2.1.3 最长公共子序列长度

2.1.4 寻找数组中第 k 小的元素

2.2 方法一:前缀和(差分数组)

三、代码

3.2 方法一:前缀和(差分数组)

四、复杂度分析

4.2 方法一:前缀和(差分数组)


前言

这是力扣的 1732 题,难度为简单,解题方案有很多种,本文讲解我认为最奇妙的一种。

这是一道非常经典的前缀和问题,虽然看似简单,但它却能让你深入理解前缀和的特点。


一、题目描述

有一个自行车手打算进行一场公路骑行,这条路线总共由 n + 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。

给你一个长度为 n 的整数数组 gain ,其中 gain[i] 是点 i 和点 i + 1 的 净海拔高度差0 <= i < n)。请你返回 最高点的海拔 。

示例 1:

输入:gain = [-5,1,5,0,-7]
输出:1
解释:海拔高度依次为 [0,-5,-4,1,1,-6] 。最高海拔为 1 。

示例 2:

输入:gain = [-4,-3,-2,-1,4,3,2]
输出:0
解释:海拔高度依次为 [0,-4,-7,-9,-10,-6,-3,-1] 。最高海拔为 0 。

提示:

  • n == gain.length
  • 1 <= n <= 100
  • -100 <= gain[i] <= 100

二、题解

2.1 前缀和的解题模板

前缀和算法是一种在处理数组或链表问题时常用的技巧,它可以有效地减少重复计算,提高算法的效率。下面是一些常见的使用前缀和算法的题目以及解题思路:

2.1.1 最长递增子序列长度

题目描述:给定一个无序数组,求最长递增子序列的长度。

解题思路:可以使用前缀和和单调栈来解决这个问题。首先,遍历数组,计算出前缀和。然后,使用单调栈记录当前递增子序列的起始位置。遍历数组时,如果当前元素大于前缀和,说明可以扩展当前递增子序列,将当前位置入栈。如果当前元素小于等于前缀和,说明当前递增子序列已经结束,弹出栈顶元素。最后,栈中剩余的元素即为最长递增子序列的起始位置,计算长度即可。

2.1.2 寻找数组中第 k 大的元素

题目描述:给定一个无序数组和一个整数k,找到数组中第k大的元素。

解题思路:可以使用前缀和和快速选择算法来解决这个问题。首先,计算出数组的前缀和。然后,使用快速选择算法在数组中找到第k小的元素。具体实现中,每次选择一个枢轴元素,将数组分成两部分,小于枢轴的元素和大于枢轴的元素。如果枢轴左边的元素个数小于k,则在左边的子数组中继续查找;如果枢轴左边的元素个数大于等于k,则在右边的子数组中继续查找。最后,当找到第k小的元素时,返回该元素即可。

2.1.3 最长公共子序列长度

题目描述:给定两个字符串,求最长公共子序列的长度。

解题思路:可以使用动态规划算法来解决这个问题。如果字符串长度分别为m和n,则可以定义一个二维数组dp[m+1][n+1],其中dp[i][j]表示字符串s1的前i个字符和字符串s2的前j个字符的最长公共子序列长度。根据动态规划的思想,状态转移方程为dp[i][j] = max(dp[i-1][j-1], dp[i-1][j], dp[i][j-1])。如果s1[i-1]等于s2[j-1],则dp[i][j] = dp[i-1][j-1] + 1;否则dp[i][j]取其他两种情况中的较大值。最终结果为dp[m][n]。

2.1.4 寻找数组中第 k 小的元素

题目描述:给定一个无序数组和一个整数k,找到数组中第k小的元素。

解题思路:可以使用前缀和和快速选择算法来解决这个问题。具体实现与寻找第k大元素类似,只不过最后返回的是第k小的元素而非第k大的元素。

2.2 方法一:前缀和(差分数组)

解这个问题需要注意以下几点:

  1. 理解题意:首先,要明确题目的要求,理解自行车手的骑行路线和海拔变化的关系。根据题目描述,自行车手从海拔为0的点开始骑行,通过一系列的海拔变化,最终要找到最高点的海拔。
  2. 分析海拔变化:根据给定的gain数组,可以分析出自行车手的海拔变化。gain[i]表示点i和点i+1之间的净海拔高度差。通过累加这些高度差,可以计算出经过每个点后的总海拔变化。
  3. 确定最高点的海拔:在计算出总的海拔变化后,需要找到最高点的海拔。这可以通过比较累加海拔和初始海拔的大小来实现。最高点的海拔即为累加海拔和初始海拔中的较大值。
  4. 注意数组边界条件:在处理gain数组时,需要注意数组的边界条件。例如,gain[0]表示起点和终点之间的海拔高度差,而gain[n-1]表示倒数第二个点和终点之间的海拔高度差。
  5. 代码实现:最后,根据上述分析,可以使用Python等编程语言实现相应的算法。在实现过程中,需要注意代码的简洁性和可读性,同时也要注意处理可能的异常情况。

思路与算法:

我们假设每个点的海拔为 hi ,由于 gain[i] 表示第 i 个点和第 i+1 个点的海拔差,因此

gain[i] = h(i+1) − hi,那么: 

可以发现,每个点的海拔都可以通过前缀和的方式计算出来。因此,我们只需要遍历一遍数组,求出前缀和的最大值,即为最高点的海拔。

实际上题目中的 gain 数组是一个差分数组,对差分数组求前缀和即可得到原海拔数组。然后求出原海拔数组的最大值即可。


三、代码

3.2 方法一:前缀和(差分数组)

Java版本:

class Solution {public int largestAltitude(int[] gain) {int high = 0, max = 0;for (int h : gain) {high += h;max = Math.max(max, high);}return max;}
}

C++版本:

class Solution {
public:int largestAltitude(std::vector<int>& gain) {int high = 0, max = 0;for (int h : gain) {high += h;max = std::max(max, high);}return max;}
};

Python版本:

class Solution:def largestAltitude(self, gain: List[int]) -> int:high = 0max_altitude = 0for h in gain:high += hmax_altitude = max(max_altitude, high)return max_altitude

Go版本:

func largestAltitude(gain []int) int {high, max := 0, 0for _, h := range gain {high += hif high > max {max = high}}return max
}func main() {gain := []int{-5, 1, 5, 0, -7}result := largestAltitude(gain)fmt.Println(result)
}

四、复杂度分析

4.2 方法一:前缀和(差分数组)

  • 时间复杂度: O(n),其中 n 为数组 gain 的长度。
  • 空间复杂度: O(1)。

相关文章:

【数据结构和算法】找到最高海拔

其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列…...

redis相关问题

1、概述&#xff1a; 1. 非关系型数据库 2. 是分布式缓存数据库 3. 使用 key -value结构存储 2、作用&#xff1a; 用作缓存降低数据库压力&#xff0c;提高性能&#xff1b;可以用作消息队列&#xff08;削峰、解耦、异步调用&#xff09; 3、基础语法&#xff1a; 基础命令…...

第41节: Vue3 watch函数

在UniApp中使用Vue3框架时&#xff0c;你可以使用watch函数来观察和响应Vue实例上的数据变化。以下是一个示例&#xff0c;演示了如何在UniApp中使用Vue3框架使用watch函数&#xff1a; <template> <view> <input v-model"message" type"text…...

Centos7:升级gcc、g++到版本5.2.0

背景 Centos7.9版本默认的g版本是4.8.5&#xff0c;在实践golang项目中&#xff0c;用到C14&#xff0c;编译时会报错&#xff1a;gcc: error: unrecognized command line option ‘-stdc14’ 因此&#xff0c;gcc需要升级到更高版本&#xff0c;我这里使用源码编译形式升级到g…...

Pytohn data mode plt

文章目录 文件的读写创建.csv类型的文件&#xff0c;并读取文件创建.xlsx文件 使用Python做图生成数据集切片取值操作修改张量中指定位置的数据 知识点torch.arange(x)torch.tensor(2)Atorch.randn(36).reshape(6,6)shapenumel()reshape(x,y,z)torch.zeros(3,3,4)torch.ones(2,…...

内网离线搭建之----kafka集群

1.系统版本 虚拟机192.168.9.184 虚拟机192.168.9.185 虚拟机192.168.9.186系统 centos7 7.6.1810 2.依赖下载 ps&#xff1a;置顶资源里已经下载好了&#xff0c;直接用&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;…...

5.1 显示窗口的内容(一)

一&#xff0c;如何显示窗口的内容&#xff1f; 显示器用于在物理硬件&#xff08;如计算机显示器或触摸屏显示器&#xff09;上显示窗口的内容。 屏幕API提供的功能允许我们创建同时写入多个窗口和显示的应用程序。屏幕支持多个显示器&#xff0c;但创建和管理使用多个显示器…...

基于包围盒算法的三维点云数据压缩和曲面重建matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 包围盒构建 4.2 点云压缩 4.3 曲面重建 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...........................................…...

关于Python里xlwings库对Excel表格的操作(十八)

这篇小笔记主要记录如何【设置单元格数据的对齐方式】。前面的小笔记已整理成目录&#xff0c;可点链接去目录寻找所需更方便。 【目录部分内容如下】【点击此处可进入目录】 &#xff08;1&#xff09;如何安装导入xlwings库&#xff1b; &#xff08;2&#xff09;如何在Wps下…...

VScode远程连接服务器,Pycharm专业版下载及远程连接(深度学习远程篇)

Visual Code、PyCharm专业版&#xff0c;本地和远程交互。 远程连接需要用到SSH协议的技术&#xff0c;常用的代码编辑器vscode 和 pycharm都有此类功能。社区版的pycharm是免费的&#xff0c;但是社区版不支持ssh连接服务器&#xff0c;只有专业版才可以&#xff0c;需要破解…...

Vue2和Vue3组件间通信方式汇总(3)------$bus

组件间通信方式是前端必不可少的知识点&#xff0c;前端开发经常会遇到组件间通信的情况&#xff0c;而且也是前端开发面试常问的知识点之一。接下来开始组件间通信方式第三弹------$bus,并讲讲分别在Vue2、Vue3中的表现。 Vue2Vue3组件间通信方式汇总&#xff08;1&#xff09…...

PyTorch加载数据以及Tensorboard的使用

一、PyTorch加载数据初认识 Dataset:提供一种方式去获取数据及其label 如何获取每一个数据及其label 总共有多少的数据 Dataloader:为后面的网络提供不同的数据形式 数据集 在编译器中导入Dataset from torch.utils.data import Dataset 可以在jupyter中查看Dataset官方文档&…...

TensorFlow是什么

TensorFlow是什么 Tensorflow是一个Google开发的第二代机器学习系统&#xff0c;克服了第一代系统DistBelief仅能开发神经网络算法、难以配置、依赖Google内部硬件等局限性&#xff0c;应用更加广泛&#xff0c;并且提高了灵活性和可移植性&#xff0c;速度和扩展性也有了大幅…...

docker-compose 安装Sonar并集成gitlab

文章目录 1. 前置条件2. 编写docker-compose-sonar.yml文件3. 集成 gitlab4. Sonar Login with GitLab 1. 前置条件 安装docker-compose 安装docker 创建容器运行的特有网络 创建挂载目录 2. 编写docker-compose-sonar.yml文件 version: "3" services:sonar-postgre…...

支付平台在选择服务器租用时要注意什么?

如果要建设一个支付平台的话要进行服务器租用&#xff0c;一旦涉及到钱的方面就必须要顾虑到多方面&#xff0c;这样才能保证安全性&#xff0c;今天小编就给大家讲一讲要注意什么呢&#xff1f; 1、带宽:带宽是业务稳定性的直接因素&#xff0c;只有带宽充足&#xff0c;这样…...

IDEA2018升级2023,lombok插件不兼容导致get/set方法无法使用

1、问题 最近了解到一款叫CodeGeeX 的智能编程助手&#xff0c;想要试用一下&#xff0c;但是IDEA2018版本太低了&#xff0c;没有CodeGeeX插件&#xff0c;于是打算将IDEA升级到2023.2.5版本&#xff0c;具体升级过程略过&#xff0c;升级完成后&#xff0c;启动项目&#xf…...

企业微信服务商代开发模式获取授权企业的客户信息

服务商代开发素材&#xff1a; 服务商可信ip 企业微信认证 测试时不用再次创建一个企业微信&#xff0c;可以用当前的企业微信作为授权企业使用一、创建代开发应用模板 1&#xff0c;代开发模板回调URL配置 参考 注意&#xff1a;保存代开发应用模板时的corpId是服务商的企业…...

库存管理方法有哪些

库存管理是工作中一个离不开的话题&#xff0c;不管是仓管还是业务员都或多或少接触过库存管理方面的工作&#xff0c;例如&#xff1a;进货、销售、库存盘点等等这些都属于库存管理的范筹&#xff0c;那么库存管理方法有哪些&#xff1f;用哪种方法管理库存比较好&#xff0c;…...

数字化车间推动制造业生产创新

一、数字化车间应用场景 1&#xff1a;资源智能化管理 数字化车间通过搭建智能化的设备监测系统&#xff0c;实时采集和监控设备的运行状态和生产数据&#xff0c;对设备进行实时管理和维护&#xff0c;降低故障率和维修成本。同时&#xff0c;通过对生产过程中的数据采集和分…...

Linux的安装及管理程序

一、如何在linux安装卸载软件 1. 编译安装 灵活性较高 难度较大 可以安装较新的版本 2. rpm安装&#xff08;redhat&#xff09; linux 包安装 查软件信息&#xff1a;是否安装&#xff0c;文件列表 rpm 软件名 3. yum yum是RPM升级版本&#xff0c;解决rpm的弊端 安装软件 首…...

PLSduino:嵌入式平台轻量级偏最小二乘建模库

1. PLSduino&#xff1a;面向嵌入式平台的偏最小二乘建模与预测库1.1 技术定位与工程价值PLSduino 是一个专为资源受限嵌入式平台&#xff08;Arduino Uno/Nano/Leonardo、ESP32 等&#xff09;设计的轻量化偏最小二乘&#xff08;Partial Least Squares, PLS&#xff09;算法实…...

【UE5】深入解析Dedicated Server专用服务器的网络同步机制与实战优化

1. UE5专用服务器基础概念解析 第一次接触UE5专用服务器(Dedicated Server)时&#xff0c;我完全被各种专业术语绕晕了。经过几个项目的实战后&#xff0c;我发现理解它的本质其实很简单——就像餐厅里的服务员与顾客的关系。服务器就是那个永远在后台忙碌的服务员&#xff0c;…...

STM32智能车库管理系统设计与实现

基于STM32的智能车库管理系统设计与实现 1. 项目概述 1.1 系统架构 本系统采用双MCU架构设计&#xff0c;主控制器采用STM32系列单片机&#xff0c;负责传感器数据采集、本地显示和报警控制&#xff1b;网络通信模块采用ESP8266 WiFi模块&#xff0c;实现数据上传至云平台。系…...

从二极管到全桥整流:5种电源防反接方案全对比,看完就知道你的项目该选哪个

从二极管到全桥整流&#xff1a;5种电源防反接方案全对比与选型指南 在嵌入式系统、消费电子和工业设备开发中&#xff0c;电源反接是最容易被忽视却可能造成灾难性后果的设计漏洞之一。想象一下&#xff1a;一个花费数月研发的物联网终端&#xff0c;因为现场安装人员的误操作…...

深入解析EasyExcel自定义列样式:基于AbstractVerticalCellStyleStrategy的灵活实现

1. 为什么需要自定义列样式&#xff1f; 在实际开发中&#xff0c;我们经常遇到这样的需求&#xff1a;导出的Excel表格需要根据不同列的内容类型设置不同的样式。比如文字列需要居中显示&#xff0c;数字列需要右对齐&#xff0c;金额列可能需要特殊格式和颜色标注。这种需求在…...

百川2-13B-4bits开源模型GPU算力适配:验证在RTX 4090D上支持max_new_tokens=2048

百川2-13B-4bits开源模型GPU算力适配&#xff1a;验证在RTX 4090D上支持max_new_tokens2048 1. 引言&#xff1a;当大模型遇上消费级显卡 如果你手头有一块RTX 4090D显卡&#xff0c;可能会好奇&#xff1a;它能流畅运行多大的语言模型&#xff1f;能生成多长的文本&#xff…...

AHT10 vs DHT11:国产温湿度传感器性能对比与选型建议

AHT10 vs DHT11&#xff1a;国产温湿度传感器性能对比与选型建议 在物联网和智能硬件快速发展的今天&#xff0c;温湿度传感器作为环境感知的基础元件&#xff0c;其性能直接影响到整个系统的可靠性和精度。面对市场上众多的传感器选择&#xff0c;开发者常常需要在成本、精度和…...

Ring-1T-FP8开源:万亿参数AI推理新突破

Ring-1T-FP8开源&#xff1a;万亿参数AI推理新突破 【免费下载链接】Ring-1T-FP8 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/Ring-1T-FP8 导语&#xff1a;近日&#xff0c;开源社区迎来重大突破——万亿参数级大语言模型Ring-1T-FP8正式开源&#xff…...

小白程序员快看!轻松入门大模型驱动的AI Agent,收藏这份超全学习指南!

本文以通俗易懂的语言介绍了AI Agent的概念、构成、分类及工作流程&#xff0c;并与传统软件进行了对比&#xff0c;阐述了AI Agent的核心优势。同时&#xff0c;文章还列举了AI Agent的常见应用场景&#xff0c;并推荐了5个适合新手使用的开发工具&#xff0c;最后通过一个实际…...

吃透Linux/C++系统编程:文件与I/O操作从入门到避坑

合集 - LLM应用实战(17) 1. LLM应用实战&#xff1a;当KBQA集成LLM(二) 2024-04-25 2. LLM应用实战&#xff1a;当KBQA集成LLM 2024-04-11 3. LLM实战&#xff1a;LLM微调加速神器-Unsloth LLama3 2024-05-14 4. LLM实战&#xff1a;LLM微调加速神器-Unsloth Qwen1.5 2024-05…...