Leetcode162. 寻找峰值

Every day a Leetcode

题目来源:162. 寻找峰值

解法1:STL

代码:

class Solution {
public:int findPeakElement(vector<int>& nums) {return max_element(nums.begin(), nums.end()) - nums.begin();}
};

复杂度分析:

时间复杂度:O(n),其中 n 是数组 nums 的长度。

空间复杂度:O(1)。

解法2:二分查找

代码:

/** @lc app=leetcode.cn id=162 lang=cpp** [162] 寻找峰值*/// @lc code=start// 二分查找// class Solution
// {
// public:
//     int findPeakElement(vector<int> &nums)
//     {
//         int n = nums.size();
//         int left = 0, right = n - 1;
//         int ans = -1;
//         while (left <= right)
//         {
//             int mid = (left + right) / 2;
//             // 辅助函数,输入下标 i,返回一个二元组 (0/1, nums[i])
//             // 方便处理 nums[-1] 以及 nums[n] 的边界情况
//             function<pair<int, int>(int)> get = [&](int index) -> pair<int, int>
//             {
//                 if (index == -1 || index == n)
//                     return {0, 0};
//                 return {1, nums[index]};
//             };
//             if (get(mid - 1) < get(mid) && get(mid) > get(mid + 1))
//             {
//                 ans = mid;
//                 break;
//             }
//             if (get(mid) < get(mid + 1))
//                 left = mid + 1;
//             else
//                 right = mid - 1;
//         }
//         return ans;
//     }
// };class Solution
{
public:int findPeakElement(vector<int> &nums){int n = nums.size();int left = 0, right = n - 1;while (left < right){int mid = (left + right) / 2;if (nums[mid] > nums[mid + 1])right = mid; // 峰顶行号 <= ielseleft = mid + 1; // 峰顶行号 > i}return left;}
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(log⁡n),其中 n 是数组 nums 的长度。

空间复杂度:O(1)。

拓展题:Leetcode 1901. 寻找峰值 II

链接:1901. 寻找峰值 II

二分包含峰顶的行号 i:

  • 如果 mat[i] 的最大值比它下面的相邻数字小,则存在一个峰顶,其行号大于 iii。缩小二分范围,更新二分区间左端点 left。
  • 如果 mat[i] 的最大值比它下面的相邻数字大,则存在一个峰顶,其行号小于或等于 i。缩小二分范围,更新二分区间右端点 right。

代码:

/** @lc app=leetcode.cn id=1901 lang=cpp** [1901] 寻找峰值 II*/// @lc code=start// 二分查找class Solution
{
public:vector<int> findPeakGrid(vector<vector<int>> &mat){if (mat.empty())return {};int m = mat.size(), n = mat[0].size();int left = 0, right = m - 1;while (left < right){int i = (left + right) / 2;int j = indexOfRowMax(mat[i]);if (mat[i][j] > mat[i + 1][j])right = i; // 峰顶行号 <= ielseleft = i + 1; // 峰顶行号 > i}return {left, indexOfRowMax(mat[left])};}// 辅函数 - 返回行中最大元素的下标int indexOfRowMax(const vector<int> &row){return max_element(row.begin(), row.end()) - row.begin();}
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(nlog⁡m),其中 m 和 n 分别为 mat 的行数和列数。需要二分 O(log⁡m) 次,每次二分需要 O(n) 的时间寻找 mat[i] 最大值的下标。
空间复杂度:O(1)。仅用到若干额外变量。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SD】差异值 生成 同一人物 制作 表情包 【1】

说明&#xff1a;只对AI生成的人物&#xff0c;效果稳定。 Reference差异值 生成表情 首先生成一张图片。 测试命令&#xff1a;1 man,chibi,full body, 模型&#xff1a;envyclarityxl02_v10.safetensors [f6c13197db] 种子&#xff1a;2704867166 》》测试命令&#xff1a…

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

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

【附三菱 MX OPC Server 6.04的安装包】MX-OPC下载以及用GX Works2和组态王进行仿真连接

使用MX-OPC来完成三菱和组态王的仿真连接。 文章目录 目录 文章目录 软件下载 1.OPC设置 2.GX Works 2 设置 3.GX Works 2 和OPC 连接测试 4.和组态王进行仿真连接 5.安装OPC后&#xff0c;GX Works2 无法打开 提示堆栈不足 6.收尾&#xff08;组态王变量的删除&#xff0…

Python - 深夜数据结构与算法之 Graph

目录 一.引言 二.图的简介 1.Graph 图 2.Undirected graph 无向图 3.Directed Graph 有向图 4.DFS / BFS 遍历 三.经典算法实战 1.Num-Islands [200] 2.Land-Perimeter [463] 3.Largest-Island [827] 四.总结 一.引言 Graph 无论是应用还是算法题目在日常生活中比较…

YOLOv7(目标检测)入门教程详解---检测,推理,训练

目录 一.前言 二.yolov7源码下载 三.detect&#xff08;检测&#xff09; 四.Train&#xff08;训练&#xff09; 数据准备&#xff1a; labellmg: 配置训练的相关文件 配置数据集文件 正式训练&#xff1a; 推理&#xff1a; 推理效果&#xff1a; 五.总结 一.前言 …

【C++练级之路】【Lv.5】动态内存管理(都2023年了,不会有人还不知道new吧?)

目录 一、C/C内存分布二、new和delete的使用方式2.1 C语言内存管理2.2 C内存管理2.2.1 new和delete操作内置类型2.2.2 new和delete操作自定义类型 三、new和delete的底层原理3.1 operator new与operator delete函数3.2 原理总结3.2.1 内置类型3.2.2 自定义类型 四、定位new表达…

docker笔记3-dockerfile定制镜像

dockerfile的组成 1.基础镜像信息&#xff0c;指定发行版本 FROM centos 2.制作镜像操作指令 RUN yum install openssh-server -y 3.容器启动指令执行 CMD [/bin/bash] dockerfile常用指令 指令 含义FROM指定基础镜像MAINTAINER指定维护人信息&#xff0c;可省略RUN基于基础…

靠谱免费的MAC苹果电脑杀毒软件CleanMyMac X2024

您是否曾经为Mac电脑的性能下降、存储空间不足而烦恼&#xff1f;是否希望有一个简单而高效的解决方案来优化您的Mac系统&#xff1f;那么&#xff0c;我向您介绍一款非常出色的工具&#xff1a;CleanMyMac X。它能够轻松处理这些问题&#xff0c;并让您的Mac恢复到最佳状态。 …

Unity 贝塞尔曲线工具获取运动轨迹

Unity 贝塞尔曲线工具获取运动轨迹 一、介绍贝塞尔曲线二、Unity中贝塞尔曲线工具介绍1.创建一个空物体挂在上BezierSpline.cs脚本组件2.由上图可知刚创建出来的有两个点和两个手柄组成3.我们可修改其坐标看下效果4.这样我们就可以获得这两个点之间的指定数量的点来作为某个物体…

算法学习系列(十一):KMP算法

目录 引言一、算法概念二、题目描述三、思路讲解三、代码实现四、测试 引言 这个KMP算法就是怎么说呢&#xff0c;就是不管算法竞赛还是找工作笔试面试&#xff0c;都是非常爱问爱考的&#xff0c;其实也是因为这个算法比较难懂&#xff0c;其实就是很难&#xff0c;所以非常个…

Apache Commons CLI:构建命令行应用的利器

引言 大家好&#xff01;我是小黑&#xff0c;本文聊聊如何用Apache Commons CLI构建命令行应用。咱们都知道&#xff0c;命令行界面&#xff08;CLI&#xff09;虽然看起来不如图形界面那么花哨&#xff0c;但在许多场景下&#xff0c;它的效率和便利性是无与伦比的。特别是对…

直排轮滑教程7

单脚弧线平衡练习 1&#xff0c;下面接下来是单脚弧线平衡练习法&#xff0c;前面是双脚弧线平衡练习法。 2&#xff0c;这个动作练好了&#xff0c;今后在滑左右转弧的时候&#xff0c;就非常自如了。 3&#xff0c;需要一个平衡控制能力&#xff0c;就是单腿的滑行控制能…