Leetcode162. 寻找峰值

2023-12-25 08:36
文章标签 寻找 峰值 leetcode162

本文主要是介绍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)。仅用到若干额外变量。

这篇关于Leetcode162. 寻找峰值的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/534877

相关文章

寻找身高相近的小朋友

题目描述: 小明今年升学到小学一年级,来到新班级后发现其他小朋友们身高参差不齐,然后就想基于各小朋友和自己的身高差对他们进行排序,请帮他实现排序。 输入描述: 第一行为正整数H和N,0<H<200,为小明的身高,0<N<50,为新班级其他小朋友个数。第二行为N个正整数H1-HN,分别是其他小朋友的身高,取值范围0<Hi<200(1<=i<=N),且N个正整数各不相同。 输出描述: 输出

【第0006页 · 数组】寻找重复数

【前言】本文以及之后的一些题解都会陆续整理到目录中,若想了解全部题解整理,请看这里: 第0006页 · 寻找重复数         今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一,是道好题,不过我们还是得先理解了它才算真正的好题。这里我们展示一种使用二进制的做法,希望能帮到你哟! 【寻找重复数】给定一个包含 n + 1 个整数的数组 nums ,其数字都

windows手工杀毒-寻找可疑进程之线程

上篇回顾:windows手工杀毒-寻找可疑进程之进程模块-CSDN博客         上篇我们介绍了如何通过进程模块寻找可疑进程,进程模块文件按照PE格式存储,我们可以使用IDA等静态分析(不需要运行文件,只看文件内容)工具分析文件行为,也可以使用windbg,x64debug等动态分析(运行文件)文件行为,也可以根据文件所属公司,文件路径等文件相关信息寻找可疑进程。今天介绍如何通过线程寻找可疑

数字时代,寻找新的生意增长点之前要做什么准备?

要做好最基础也最繁复的数据管理。 在竞争日益激烈的快消市场中,企业面临前所未有的挑战与压力。在这种高压环境下,数字化转型不再仅仅是选择,而是企业探索新的业务增长点、保持竞争优势的关键战略。然而,随着企业数字化进程的加速推进,业务系统持续生成的多样化与复杂化数据使得传统数据分析手段难以应对。因各系统间业财口径的不一致和数据维度的差异,企业在数据整合与分析过程中经常遭遇瓶颈,难以获得准确且具有前瞻性

书客、松下、飞利浦护眼台灯怎么样?测评寻找护眼台灯天花板!

大家好,我是专注在护眼领域的一名评测师,长期以来,我致力于探索并体验各类能保护视力健康的护眼产品。今天,我来和大家分享我对护眼台灯的深入评测。护眼台灯作为日常学习生活的一部分,视觉体验的好坏往往取决于所选用的台灯,然而,并非所有的护眼台灯都能完美契合我们对于舒适度与效率的期待。 作为一名经验丰富的评测博主,我深知光谱结构、光线设计这些都是评价一款护眼台灯好坏的重要标准。基于此,我特意选择了市场上

编程之美——寻找最大的K个数

编程之美——寻找最大的K个数 解法一: 我们先假设元素的数量不大,例如在几千个左右,在这种情况下,那我们就排序一下吧。在这里,快速排序或堆排序都是不错的选择,他们的平均时间复杂度都是 O(N * log2N)。然后取出前 K 个,O(K)。 总时间复杂度 O(N * log2N)+ O(K) = O(N * log2N)。 你一定注意到了,当 K=1 时,上面的算法也是

书客、孩视宝、雷士护眼大路灯怎么样?测评寻找顶尖机型天花板!

书客、孩视宝、雷士护眼大路灯怎么样?最近,众多读者纷纷表达了对护眼大路灯推荐和护眼大路灯测评的需求,希望能够提高室内光线质量,缓解孩子在长时间用眼带来的视觉疲劳、眼睛酸痛的问题。基于多年的使用经验,我汇总了一系列关于护眼大路灯的经验和购买建议。为了更全面地呈现本期的护眼大路灯测评,我花费了一个月的时间,收集了来自不同用户的使用体验反馈,对比书客、孩视宝、雷士这3款热门护眼大路灯的性能表现。

秋招突击——算法练习——8/30、9/4——技巧题练习——复习{}——新作{只出现一次的数字、多数元素、颜色分类、下一个排列、寻找重复数}

文章目录 引言复习新作136、只出现一次的数字个人实现 169、多数元素个人实现 75、颜色分类个人实现参考实现 31、下一个排列个人实现参考实现 287寻找重复数个人实现参考实现 总结 引言 手撕的代码大部分都是出自于这里,还是要继续加强,把剩下一些零碎的题目再过一遍,然后再把hot100再刷一遍,这次重在于思想,而不是代码和答案。 复习 新作 136、只出现一次的数

当小程序遭遇攻击或超出流量峰值时:SCDN边缘加速的高效防护策略!

在数字化时代,小程序因其便捷性和丰富的功能而备受用户喜爱,但这也使其成为了网络攻击的目标之一。DDoS攻击、CC攻击等不仅会影响小程序的正常运行,还会损害用户体验和品牌形象。在这种情况下,选择合适的安全防护措施至关重要。边缘加速提供了一体化的分布式安全防御解决方案,能够有效应对这些问题。 Edge SCDN边缘加速的核心功能 Edge SCDN边缘加速是一款一体化分布式安全防御产品,它不仅提供

盘点成都产业园前十,寻找你的理想创业地!

成都,这座充满活力与机遇的城市,拥有众多优秀的产业园。今天,就让我们一同来盘点成都产业园前十,为你的创业梦想找到最理想的栖息之地。 国际数字影像产业园:作为成都产业园排名前十的数字文创产业园,国际数字影像产业园在数字影像、数字文创、数字媒体等领域具有明显优势。该园区为创业者提供了专业的产业服务平台和丰富的共享资源,是数字影像产业创新发展的新高地。 成都高新技术产业开发区:在高新技术产业孵化