<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      7 搜索m*n矩陣中的目標值(Search a 2D Matrix)

      1 題目

      ??搜索m*n矩陣中的目標值(Search a 2D Matrix)

      lintcode:題號——28,難度——easy

      2 描述

      ??搜索 m × n矩陣中是否存在值 target ,這個矩陣具有以下特性:每行中的整數從左到右是排序的;每行的第一個數大于上一行的最后一個整數。

      ??樣例1:

      輸入:矩陣 = [[5]], target = 2
      輸出:false
      解釋:矩陣中沒有包含2,返回false。

      ??樣例2:

      輸入:矩陣 = [
      [1, 3, 5, 7],
      [10, 11, 16, 20],
      [23, 30, 34, 50]],target = 3
      輸出:true
      解釋:矩陣中包含3,返回true。

      3 思路

      ??矩陣從左到右遞增,每行行首大于上一行行尾,相當于可以把矩陣看成多個遞增區(qū)間,采用從頭到尾遍歷整個矩陣的查找方式的話,時間復雜度為O(m * n);優(yōu)化一下,將整個矩陣拉長成一個遞增序列,再采用二分法,時間復雜度為O[log(m*n)];或者,先縱向做一次二分法,確定目標值可能存在的區(qū)間,即某一行,再對該行做一個二分法,時間復雜度為O(log m + log n) ,與第二種方式的耗時 O[log(m*n)]相等。
      ??下面會采用最后一種方式來實現(xiàn),二分法依然可以套用經典二分搜索[1]的代碼模版。

      1. 在矩陣第一列中進行二分搜索,找到小于目標值的最大行首元素,目標值只可能在該行中;
      2. 對目標行進行二分搜索,即可確定是否存在該值。

      ??其實還有一種思維上更簡單的方式,類似走樓梯,從左下角為起點,如果當前值大于目標值,則向上走一格;如果當前值小于目標值,則向右走一格,直到找到目標值,或者走出矩陣范圍為止。

      走樓梯算法在代碼上更精簡,代碼一起在結尾給出,但該算法時間復雜度為O(m+n),比O(log m + log n)耗時更長。

      3.1 圖解

      輸入:矩陣 = [
      [01, 03, 05, 07,09],
      [10, 11, 16, 20,21],
      [23, 30, 34, 50,57],
      [71, 80, 86, 87,99]],target = 20
      輸出:true
      解釋:矩陣中包含20,返回true。

      graph TD X['01, 03, 05, 07, 09'<br/>'10, 11, 16, 20, 21'<br/>'23, 30, 34, 50, 57'<br/>'71, 80, 86, 87, 99'] X -- 首列 --> A['01, -, -, -, -'<br/>'10, -, -, -, -'<br/>'23, -, -, -, -'<br/>'71, -, -, -, -'] A -- 二分法找到小于20的最大值 --> B['-, -, -, -, -'<br/>'10, -, -, -, -'<br/>'-, -, -, -, -'<br/>'-, -, -, -, -'] B -- 取出該行 --> C['-, -, -, -, -'<br/>'10, 11, 16, 20, 21'<br/>'-, -, -, -, -'<br/>'-, -, -, -, -'] C -- 再二分法搜索目標值 --> D['-, -, -, -, -'<br/>'-, -, -, 20, -'<br/>'-, -, -, -, -'<br/>'-, -, -, -, -'] D -- 搜索成功 --> F[存在]

      3.2 時間復雜度

      ??先是縱向進行二分搜索,然后橫向進行二分搜索,所以算法的時間復雜度為O(log m + log n)

      3.3 空間復雜度

      ??算法的空間復雜度為O(1)

      4 源碼

      ??注意事項:

      對第一列進行二分查找的時候是在第一列中尋找小于目標值的最大值,所以在跳出循環(huán)后的對比中,按照target相對于start~end的位置關系,可以分為三種情況去處理。

      ??兩次二分搜索算法,C++版本:

      /**
      * @param matrix: 矩陣
      * @param target: 目標值
      * @return: 返回true表示目標值在矩陣中,否則返回false
      */
      bool searchMatrix(vector<vector<int>> &matrix, int target) {
          // write your code here
          if (matrix.size() == 0 || matrix.front().size() == 0)
          {
              return false;
          }
      
          int start = 0;
          int end = matrix.size() - 1;
          int mid = 0;
          while (start + 1 < end)
          {
              mid = start + (end - start) / 2;
              if (matrix.at(mid).front() == target)
              {
                  return true;
              }
              if (matrix.at(mid).front() < target)
              {
                  start = mid;
              }
              if (matrix.at(mid).front() > target)
              {
                  end = mid;
              }
          }
      
          if (matrix.at(start).front() > target)
          {
              return false;
          }
          if (matrix.at(end).front() > target)
          {
              return binarySearch(matrix, start, target);
          }
          else
          {
              return binarySearch(matrix, end, target);
          }
      }
      
      bool binarySearch(vector<vector<int>> & matrix, int row, int target)
      {
          int start = 0;
          int end = matrix.at(row).size() - 1;
          int mid = 0;
          while (start + 1 < end)
          {
              mid = start + (end - start) / 2;
              if (matrix.at(row).at(mid) == target)
              {
                  return mid;
              }
              if (matrix.at(row).at(mid) < target)
              {
                  start = mid;
              }
              if (matrix.at(row).at(mid) > target)
              {
                  end = mid;
              }
          }
      
          if (matrix.at(row).at(start) == target)
          {
              return true;
          }
          if (matrix.at(row).at(end) == target)
          {
              return true;
          }
      
          return false;
      }
      

      附加:
      ??走樓梯算法,C++版本:

      bool searchMatrix(vector<vector<int>> &matrix, int target) {
          // write your code here
          if (matrix.empty())
          {
              return false;
          }
          if (matrix.front().empty())
          {
              return false;
          }
          
          // 走樓梯法
          int row = matrix.size() - 1;
          int col = 0;
          int curValue = 0;
          while (row >= 0 && col <= matrix.front().size() - 1)
          {
              curValue = matrix.at(row).at(col); // 起點左下角
              if (curValue > target)
              {
                  row--; // 如果目標元素不存在,則最后會走出矩陣范圍
              }
              else if (curValue < target)
              {
                  col++; // 如果目標元素不存在,則最后會走出矩陣范圍
              }
              else
              {
                  return true;
              }
          }
          
          return false;
      }
      

      1. 經典二分搜索:https://blog.csdn.net/SeeDoubleU/article/details/118271548 ??

      posted @ 2021-07-10 01:08  seedoubleu  閱讀(197)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产免费播放一区二区三区| 成人免费乱码大片a毛片| 另类 专区 欧美 制服| 亚洲欧美v国产蜜芽tv| 久久精品高清一区二区三区| 国产suv精品一区二区四| 亚洲色大成网站www久久九九| 中文无码热在线视频| 国产精品美腿一区在线看| 与子敌伦刺激对白播放| 亚洲一区二区三区蜜桃臀| 和艳妇在厨房好爽在线观看 | 亚洲色偷拍区另类无码专区| 亚洲热线99精品视频| 免费国产一区二区不卡| 妺妺窝人体色www看美女| 午夜亚洲国产理论片亚洲2020| 中文字幕日韩有码国产| 成A人片亚洲日本久久| 国产精品成人av电影不卡| 东京热人妻丝袜无码AV一二三区观| 亚洲精品国产精品国在线| 中文字幕国产精品专区| 日韩乱码视频一区二区三区| 国产精品人妻一区二区高| 天堂www在线中文| 国产综合久久99久久| 亚洲精品国产aⅴ成拍色拍| 日韩一区在线中文字幕| 亚洲av高清一区二区| 男女啪啪高潮激烈免费版| 国产成人精品一区二区无| 人妻精品动漫H无码中字| 永久免费av无码网站直播| 我要看亚洲黄色太黄一级黄 | 国产一区二区三区小说 | 亚洲美免无码中文字幕在线 | AV无码不卡一区二区三区| 欧美熟妇乱子伦XX视频| 国产成人高清亚洲综合| 熟女系列丰满熟妇AV|