LeetCode 1901. 找出顶峰元素 II(二分查找)
文章目录
- 1. 题目
- 2. 解题
1. 题目
一个 2D 网格中的 顶峰元素 是指那些 严格大于 其相邻格子(上、下、左、右)的元素。
给你一个 从 0 开始编号 的 m x n 矩阵 mat ,其中任意两个相邻格子的值都 不相同 。找出 任意一个 顶峰元素 mat[i][j]
并 返回其位置 [i,j]
。
你可以假设整个矩阵周边环绕着一圈值为 -1 的格子。
要求必须写出时间复杂度为 O(m log(n)) 或 O(n log(m))
的算法
示例 1:
输入: mat = [[1,4],[3,2]]
输出: [0,1]
解释: 3和4都是顶峰元素,所以[1,0]和[0,1]都是可接受的答案。
示例 2:
输入: mat = [[10,20,15],[21,30,14],[7,16,32]]
输出: [1,1]
解释: 30和32都是顶峰元素,所以[1,1]和[2,2]都是可接受的答案。提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 500
1 <= mat[i][j] <= 10^5
任意两个相邻元素均不相等.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-a-peak-element-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 解题
- 对行进行二分查找,找到中行 mid, 及其上下两行,每行的最大值
- 如果 mid 行最大值 >= 相邻两行的,则找到了顶峰
- 否则,二分查找较大的一侧,顶峰元素肯定存在
class Solution {public:vector<int> findPeakGrid(vector<vector<int>>& mat) {int m = mat.size(), n = mat[0].size();int l = 0, r = m-1, mid;int u, v, w, idx;vector<int> res;while(l <= r){mid = (l+r)>>1;res = getmax(mat, mid, m, n);u = res[0], idx = res[1];res = getmax(mat, mid-1, m, n);v = res[0];res = getmax(mat, mid+1, m, n);w = res[0];if(u>=v && u>=w) return {mid, idx};else if(v >= u)r = mid-1;elsel = mid+1;}return {-1, -1};}vector<int> getmax(vector<vector<int>>& mat, int r, int m, int n){if(r < 0 || r >= m) return {-1, -1};int maxv = -1, idx = -1;for(int i = 0; i < n; ++i){if(maxv < mat[r][i]){idx = i;maxv = mat[r][i];}}return {maxv, idx};}
};
144 ms 45.2 MB C++
我的CSDN博客地址 https://michael.blog.csdn.net/
长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
LeetCode 1901. 找出顶峰元素 II(二分查找)相关推荐
- 59. Leetcode 81. 搜索旋转排序数组 II(二分查找-局部有序)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同.在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 ,使 ...
- leetcode 81. 搜索旋转排序数组 II(二分查找)
已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同. 在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转 , ...
- 给定一个由0和1组成的矩阵,找出每个元素到最近的0的距离
给定一个由 0 和 1 组成的矩阵,找出每个元素到最近的 0 的距离. (Leetcode 542) 两个相邻元素间的距离为 1 . 示例 1: 输入: 0 0 0 0 1 0 0 0 0 输出 0 ...
- LeetCode 2058. 找出临界点之间的最小和最大距离
文章目录 一.题目 1.题目描述 2.基础框架 3.原题链接 二.解题报告 1.思路分析 2.时间复杂度 3.代码详解 三.本题小知识 四.加群须知 一.题目 1.题目描述 链表中的 临界点 定义 ...
- Java黑皮书课后题第7章:7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则最小
7.10(找出最小元素的下标)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素下标.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值的下标(多个则返回最小的下标) 题目 题目描述 ...
- Java黑皮书课后题第7章:7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素。编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值
7.9(找出最小元素)使用下面的方法头编写一个方法,求出一个整数数组中的最小元素.编写测试程序,提示用户输入10个数字,调用这个方法返回最小值,并显示这个最小值 题目 题目描述与运行示例 破题 代码 ...
- 约瑟夫环——递推公式详解(leetcode 1823. 找出游戏的获胜者)
约瑟夫环--递推公式详解(leetcode 1823. 找出游戏的获胜者) 约瑟夫环问题 约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3-n分别表示)围坐在一张圆桌周围. ...
- LeetCode 1823. 找出游戏的获胜者
LeetCode 1823. 找出游戏的获胜者 文章目录 LeetCode 1823. 找出游戏的获胜者 题目描述 一.解题关键词 二.解题报告 1.思路分析 2.时间复杂度 3.代码示例 2.知识点 ...
- 实验4.1对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 。 要求: 1)数组有10个元素; 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息; 3)输出时,首先输出数组
/*SY4.1 题目描述 对任意一个一维数组,从中找出数组元素的最大值和最小值并输出 . 要求: 1)数组有10个元素: 2)使用scanf函数实现数组元素的输入,输入前给出必要的提示信息: 3)输出 ...
最新文章
- 《自然》 脑机接口新突破 人脑信号转文本准确率达97%
- 以Attribute加上Header验证
- 2018智能反欺诈洞察报告:黑中介、黑产智能化趋势明显
- python 漂亮界面demo_在这个什么都看脸的时代,如何用 GUI 提高 python 程序的颜值?...
- C语言的soap报文处理转义字符,webservice传递特殊字符时的解决办法
- [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案
- extract()和extact_first()的区别
- 剑指Offer:面试题31——连续子数组的最大和(java实现)
- 同一批人做的产品,一年跟十年,产品质量不会有任何变化
- 无线路由器网络测试软件,简单快速测试家里无线路由器的网速和性能
- 基于Springboot+vue的办公OA系统#毕业设计
- 每日一练_13 :java设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声(使用接口)。
- springboot自定义start解析(start中配置从数据源)
- C语言实现推箱子游戏完整代码
- WORD表格合并EXCEL表格格式错乱
- 安装CAD缺少html,Win10系统安装CAD2007失败缺少.NET组件如何解决
- ZZULIOJ:1091: 童年生活二三事(多实例测试)
- Moran_DeepLPF_Deep_Local_Parametric_Filters_for_Image_Enhancement_CVPR_2020_paper
- android百度车载导航,百度CarLife车机端
- vue之动画( 仿jquery的slideToggle动画效果 )
热门文章
- dto 是只给前端需要的数据吗_DO、VO、DTO...XXOO,你弄明白了么
- kail中tools的安装和第一个php学习笔记
- 八大排序算法:插入(2:插入、希尔)、选择(2:选择、堆)、交换(2:冒泡、快速)、归并、基数
- mysql集群怎么实现状态机_分布式中的状态机
- 前端模块化(二):模块化编程
- JSON.parse和JSON.stringify 参数详解
- imagick用法!
- thinkpad s3 安装win8 kali双系统笔记
- sql server :distinct 与order by 一起使用要注意
- 基础算法学习(二)_二叉树及应用赫夫曼编码