LintCode 390. hallazgo pico II

1. Tema

Dada una matriz A número entero, que tiene las siguientes características:

  • enteros adyacentes diferentes
  • Matriz tiene n filas ym columnas.
  • Para todos los i <n, son A[i][0] < A[i][1] && A[i][m - 2] > A[i][m - 1]
  • Para todos los j <m, hay A[0][j] < A[1][j] && A[n - 2][j] > A[n - 1][j]

Definimos una posición [i, j] es el pico, si y sólo si satisface:

  • 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]

Encuentre un valor máximo del elemento de la matriz, se devuelven sus coordenadas.

样例 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)?

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

2. Resolución de Problemas

class Solution {
public:
    vector<int> findPeakII(vector<vector<int>> &A) {
        int n = A.size(), m = A[0].size();
        int i = 1, j = 1;//从(1,1)开始,(0,0)不可能是答案
        vector<int> ans;
        for( ; 1 ; ++i)
        {
        	//找中间点
            while(A[i][j] < A[i][j+1])
                j++;
            while(A[i][j] < A[i][j - 1])
                j--;
            //判断上下是否也满足
            if(A[i][j] > A[i + 1][j] && A[i][j] > A[i - 1][j])
            {
                ans.push_back(i);
                ans.push_back(j);
                return ans;
            }
        }
        return {-1,-1};
    }
};

100% de los datos de prueba por el
tiempo total de 2399 ms
su presentación venció presentación de 39.40%!

Publicados 715 artículos originales · ganado elogios 715 · vistas 210 000 +

Supongo que te gusta

Origin blog.csdn.net/qq_21201267/article/details/104800024
Recomendado
Clasificación