Advertisement
sweet1cris

Untitled

Jan 9th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.03 KB | None | 0 0
  1. // O(n + m) 解法
  2. class Solution {
  3.     /**
  4.      * @param A: An integer matrix
  5.      * @return: The index of the peak
  6.      */
  7.     public List<Integer> find(int x1, int x2, int y1, int y2,
  8.                               int[][] A) {
  9.        
  10.         int mid1 = x1 + (x2 - x1) / 2;
  11.         int mid2 = y1 + (y2 - y1) / 2;
  12.        
  13.         int x = mid1, y = mid2;
  14.         int max = A[mid1][mid2];
  15.         for (int i = y1; i <= y2; ++i)
  16.             if (A[mid1][i] > max) {
  17.                 max = A[mid1][i];
  18.                 x = mid1;
  19.                 y = i;
  20.             }
  21.  
  22.         for (int i = x1; i <= x2; ++i)
  23.             if (A[i][mid2] > max) {
  24.                 max = A[i][mid2];
  25.                 x = i;
  26.                 y = mid2;
  27.             }
  28.        
  29.         boolean isPeak = true;
  30.         if (A[x - 1][y] > A[x][y]) {
  31.             isPeak = false;
  32.             x -= 1;
  33.         } else if (A[x + 1][y] > A[x][y]) {
  34.             isPeak = false;
  35.             x += 1;
  36.         } else if (A[x][y - 1] > A[x][y]) {
  37.             isPeak = false;
  38.             y -= 1;
  39.         } else if (A[x][y + 1] > A[x][y]) {
  40.             isPeak = false;
  41.             y += 1;
  42.         }
  43.            
  44.         if (isPeak) {
  45.             return new ArrayList<Integer>(Arrays.asList(x, y));
  46.         }
  47.        
  48.         if (x >= x1 && x < mid1 && y >= y1 && y < mid2) {
  49.             return find(x1, mid1 - 1, y1, mid2 - 1, A);
  50.         }
  51.        
  52.         if (x >= 1 && x < mid1 && y > mid2 && y <= y2) {
  53.             return find(x1, mid1 - 1, mid2 + 1, y2, A);
  54.         }
  55.        
  56.         if (x > mid1 && x <= x2 && y >= y1 && y < mid2) {
  57.             return find(mid1 + 1, x2, y1, mid2 - 1, A);
  58.         }
  59.        
  60.         if (x >= mid1 && x <= x2 && y > mid2 && y <= y2) {
  61.             return find(mid1 + 1, x2, mid2 + 1, y2, A);
  62.         }
  63.        
  64.         return new ArrayList<Integer>(Arrays.asList(-1, -1));
  65.        
  66.     }
  67.     public List<Integer> findPeakII(int[][] A) {
  68.         // write your code here
  69.         int n = A.length;
  70.         int m = A[0].length;
  71.         return find(1, n - 2, 1, m - 2, A);
  72.     }
  73. }
  74.  
  75.  
  76. class Solution {
  77.     /**
  78.      * @param A: An integer matrix
  79.      * @return: The index of the peak
  80.      */
  81.     public List<Integer> findPeakII(int[][] A) {
  82.         // this is the nlog(n) method
  83.         int low = 1, high = A.length-2;
  84.         List<Integer> ans = new ArrayList<Integer>();
  85.         while(low <= high) {
  86.             int mid = (low + high) / 2;
  87.             int col = find(mid, A);
  88.             if(A[mid][col] < A[mid - 1][col]) {
  89.                 high = mid - 1;
  90.             } else if(A[mid][col] < A[mid + 1][col]) {
  91.                 low = mid + 1;
  92.             } else {
  93.                 ans.add(mid);
  94.                 ans.add(col);
  95.                 break;
  96.             }
  97.         }
  98.         return ans;
  99.     }
  100.     int find(int row, int [][]A) {
  101.         int col = 0;
  102.         for(int i = 0; i < A[row].length; i++) {
  103.             if(A[row][i] > A[row][col]) {
  104.                 col = i;
  105.             }
  106.         }
  107.         return col;
  108.     }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement