九章算法 | 字节跳动面试题: 寻找峰值 II

描述 给定一个整数矩阵 A, 它有如下特性: 相邻的整数不同 矩阵有 n 行 m 列,n和m不会小于3。 对于所有的 i < n, 都有 A[i][0] < A[i][1] && A[i][m - 2] > A[i][m - 1] 对于所有的 j < m, 都有 A[0][j] < A[1][j] && A[n - 2][j] >...
摘要由CSDN通过智能技术生成

描述

给定一个整数矩阵 A, 它有如下特性:

  • 相邻的整数不同
  • 矩阵有 n 行 m 列,n和m不会小于3。
  • 对于所有的 i < n, 都有 A[i][0] < A[i][1] && A[i][m - 2] > A[i][m - 1]
  • 对于所有的 j < m, 都有 A[0][j] < A[1][j] && A[n - 2][j] > A[n - 1][j]

我们定义一个位置 [i,j] 是峰值, 当且仅当它满足:

A[i][j] > A[i + 1][j] && A[i][j] > A[i - 1][j] &&
A[i][j] > A[i][j + 1] && A[i][j] > A[i][j - 1]

找到该矩阵的一个峰值元素, 返回它的坐标.

保证至少存在一个峰值, 而如果存在多个峰值, 返回任意一个即可.

在线评测地址:

LintCode 领扣

样例 1:

输入:  
    [ 
      [1, 2, 3, 6,  5], 
      [16,41,23,22, 6], 
      [15,17,24,21, 7], 
      [14,18,19,20,10], 
      [13,14,11,10, 9] 
    ] 
输出: [1,1] 
解释: [2,2] 也是可以的. [1,1] 的元素是 41, 大于它四周的每一个元素 (2, 16, 23, 17). 

样例2:

输入:  
    [ 
      [1, 5, 3], 
      [4,10, 9], 
      [2, 8, 7] 
    ] 
输出: [1,1] 
解释: 只有这一个峰值 

挑战

O(n+m) 的时间复杂度.

如果你 认为 你使用了 O(nlogm) 或 O(mlogn) 的算法, 能否证明它的复杂度其实是 O(n+m)? 或者想一个类似的算法但是复杂度是O(n+m)?

解题思路

  • 峰值不是最大值,只是比四个方向上的数值都大,是局部性的最值。
  • 对于每一个点,它总能属于某一座山峰(可以不止一座)。
  • 找峰值可以想象成爬山,总是要不断的从低处向高处移动,这样移动到最后一定是峰值。

代码思路

  • 在图上随机取一点,若有相邻位置比当前点大则向该相邻位置移动,直到当前点成为峰值。
  • 最坏情况是螺旋式上升,且随机在了起点位置,那么就要爬升一半的点

1 2 3 4 5

0 0 0 0 6

15 16 17 0 7

14 0 0 0 8

13 12 11 10 9

  • 如果遇到最坏的情况,我们可以通过当爬升超过一定距离
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值