<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ?LeetCode刷題實戰(zhàn)240:搜索二維矩陣 II

          共 5681字,需瀏覽 12分鐘

           ·

          2021-04-18 18:17

          算法的重要性,我就不多說了吧,想去大廠,就必須要經(jīng)過基礎(chǔ)知識和業(yè)務(wù)邏輯面試+算法面試。所以,為了提高大家的算法能力,這個公眾號后續(xù)每天帶大家做一道算法題,題目就從LeetCode上面選 !

          今天和大家聊的問題叫做 搜索二維矩陣 II,我們先來看題面:
          https://leetcode-cn.com/problems/search-a-2d-matrix-ii/

          Write an efficient algorithm that searches for a target value in an m x n integer matrix. The matrix has the following properties:


          Integers in each row are sorted in ascending from left to right.

          Integers in each column are sorted in ascending from top to bottom.


          編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標(biāo)值 target 。該矩陣具有以下特性:
          每行的元素從左到右升序排列。
          每列的元素從上到下升序排列。

          示例


          解題


          矩陣已經(jīng)排過序,就需要使用二分法搜索以加快我們的算法。

          首先,我們確保矩陣不為空。那么,如果我們迭代矩陣對角線,從當(dāng)前元素對列和行搜索,我們可以保持從當(dāng)前(row,col) 對開始的行和列為已排序。因此,我們總是可以二分搜索這些行和列切片。我們以如下邏輯的方式進(jìn)行 : 在對角線上迭代,二分搜索行和列,直到對角線的迭代元素用完為止(意味著我們可以返回 false )或者找到目標(biāo)(意味著我們可以返回 true )。binary search 函數(shù)的工作原理和普通的二分搜索一樣,但需要同時搜索二維數(shù)組的行和列。

          class Solution {
              private boolean binarySearch(int[][] matrix, int target, int start, boolean vertical) {
                  int lo = start;
                  int hi = vertical ? matrix[0].length-1 : matrix.length-1;

                  while (hi >= lo) {
                      int mid = (lo + hi)/2;
                      if (vertical) { // searching a column
                          if (matrix[start][mid] < target) {
                              lo = mid + 1;
                          } else if (matrix[start][mid] > target) {
                              hi = mid - 1;
                          } else {
                              return true;
                          }
                      } else { // searching a row
                          if (matrix[mid][start] < target) {
                              lo = mid + 1;
                          } else if (matrix[mid][start] > target) {
                              hi = mid - 1;
                          } else {
                              return true;
                          }
                      }
                  }

                  return false;
              }

              public boolean searchMatrix(int[][] matrix, int target) {
                  // an empty matrix obviously does not contain `target`
                  if (matrix == null || matrix.length == 0) {
                      return false;
                  }

                  // iterate over matrix diagonals
                  int shorterDim = Math.min(matrix.length, matrix[0].length);
                  for (int i = 0; i < shorterDim; i++) {
                      boolean verticalFound = binarySearch(matrix, target, i, true);
                      boolean horizontalFound = binarySearch(matrix, target, i, false);
                      if (verticalFound || horizontalFound) {
                          return true;
                      }
                  }
                  
                  return false;
              }
          }


          好了,今天的文章就到這里,如果覺得有所收獲,請順手點個在看或者轉(zhuǎn)發(fā)吧,你們的支持是我最大的動力 。

          上期推文:

          LeetCode1-220題匯總,希望對你有點幫助!
          LeetCode刷題實戰(zhàn)221:最大正方形
          LeetCode刷題實戰(zhàn)222:完全二叉樹的節(jié)點個數(shù)
          LeetCode刷題實戰(zhàn)223:矩形面積
          LeetCode刷題實戰(zhàn)224:基本計算器
          LeetCode刷題實戰(zhàn)225:用隊列實現(xiàn)棧
          LeetCode刷題實戰(zhàn)226:翻轉(zhuǎn)二叉樹
          LeetCode刷題實戰(zhàn)227:基本計算器 II
          LeetCode刷題實戰(zhàn)228:匯總區(qū)間
          LeetCode刷題實戰(zhàn)229:求眾數(shù) II
          LeetCode刷題實戰(zhàn)230:二叉搜索樹中第K小的元素
          LeetCode刷題實戰(zhàn)231:2的冪
          LeetCode刷題實戰(zhàn)232:用棧實現(xiàn)隊列
          LeetCode刷題實戰(zhàn)233:數(shù)字 1 的個數(shù)
          LeetCode刷題實戰(zhàn)234:回文鏈表
          LeetCode刷題實戰(zhàn)235:二叉搜索樹的最近公共祖先
          LeetCode刷題實戰(zhàn)236:二叉樹的最近公共祖先

          LeetCode刷題實戰(zhàn)237:刪除鏈表中的節(jié)點

          LeetCode刷題實戰(zhàn)238:除自身以外數(shù)組的乘積

          LeetCode刷題實戰(zhàn)239:滑動窗口最大值


          瀏覽 28
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  成人毛片基地 | 91免费片 | 国产2区| 五月天成人激情视频 | 国产美女vip |