最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++實現(xiàn)LeetCode(74.搜索一個二維矩陣)

 更新時間:2021年07月17日 10:22:46   作者:Grandyang  
這篇文章主要介紹了C++實現(xiàn)LeetCode(74.搜索一個二維矩陣),本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

[LeetCode] 74. Search a 2D Matrix 搜索一個二維矩陣

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

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

Example 1:

Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
Output: true

Example 2:

Input: matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
Output: false

Constraints:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -104 <= matrix[i][j], target <= 104

這道題要求搜索一個二維矩陣,由于給的矩陣是有序的,所以很自然的想到要用二分查找法,可以在第一列上先用一次二分查找法找到目標值所在的行的位置,然后在該行上再用一次二分查找法來找是否存在目標值。對于第一個二分查找,由于第一列的數(shù)中可能沒有 target 值,該如何查找呢,如果是查找第一個不小于目標值的數(shù),當 target 在第一列時,會返回 target 所在的行,但若 target 不在的話,有可能會返回下一行,不好統(tǒng)一。所以可以查找第一個大于目標值的數(shù),也就是總結帖中的第三類,這樣只要回退一個,就一定是 target 所在的行。但需要注意的一點是,如果返回的是0,就不能回退了,以免越界,記得要判斷一下。找到了 target 所在的行數(shù),就可以再次使用二分搜索,此時就是總結帖中的第一類了,查找和 target 值相同的數(shù),也是最簡單的一類,分分鐘搞定即可,參見代碼如下:

解法一:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) return false;
        int left = 0, right = matrix.size();
        while (left < right) {
            int mid = (left + right) / 2;
            if (matrix[mid][0] == target) return true;
            if (matrix[mid][0] < target) left = mid + 1;
            else right = mid;
        }
        int tmp = (right > 0) ? (right - 1) : right;
        left = 0;
        right = matrix[tmp].size();
        while (left < right) {
            int mid = (left + right) / 2;
            if (matrix[tmp][mid] == target) return true;
            if (matrix[tmp][mid] < target) left = mid + 1;
            else right = mid;
        }
        return false;
    }
};

當然這道題也可以使用一次二分查找法,如果我們按S型遍歷該二維數(shù)組,可以得到一個有序的一維數(shù)組,只需要用一次二分查找法,而關鍵就在于坐標的轉換,如何把二維坐標和一維坐標轉換是關鍵點,把一個長度為n的一維數(shù)組轉化為 m*n 的二維數(shù)組 (m*n = n)后,那么原一維數(shù)組中下標為i的元素將出現(xiàn)在二維數(shù)組中的 [i/n][i%n] 的位置,有了這一點,代碼很好寫出來了:

解法二:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) return false;
        int m = matrix.size(), n = matrix[0].size();
        int left = 0, right = m * n;
        while (left < right) {
            int mid = (left + right) / 2;
            if (matrix[mid / n][mid % n] == target) return true;
            if (matrix[mid / n][mid % n] < target) left = mid + 1;
            else right = mid;
        }
        return false;
    }
};

這道題其實也可以不用二分搜索法,直接使用雙指針也是可以的,i指向0,j指向列數(shù),這樣第一個被驗證的數(shù)就是二維數(shù)組右上角的數(shù)字,假如這個數(shù)字等于 target,直接返回 true;若大于 target,說明要減小數(shù)字,則列數(shù)j自減1;若小于 target,說明要增加數(shù)字,行數(shù)i自增1。若 while 循環(huán)退出了還是沒找到 target,直接返回 false 即可,參見代碼如下:

解法三:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty() || matrix[0].empty()) return false;
        int i = 0, j = (int)matrix[0].size() - 1;
        while (i < matrix.size() && j >= 0) {
            if (matrix[i][j] == target) return true;
            else if (matrix[i][j] > target) --j;
            else ++i;
        }   
        return false;
    }
};

到此這篇關于C++實現(xiàn)LeetCode(74.搜索一個二維矩陣)的文章就介紹到這了,更多相關C++實現(xiàn)搜索一個二維矩陣內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • OpenCV實現(xiàn)拼圖算法

    OpenCV實現(xiàn)拼圖算法

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)拼圖算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 線程池的原理與實現(xiàn)詳解

    線程池的原理與實現(xiàn)詳解

    下面利用C語言來實現(xiàn)一個簡單的線程池,為了使得這個線程池庫使用起來更加方便,特在C實現(xiàn)中加入了一些OO的思想,與Objective-C不同,它僅僅是使用了struct來模擬了c++中的類,其實這種方式在linux內(nèi)核中大量可見
    2013-09-09
  • c語言算術運算符越界問題解決方案

    c語言算術運算符越界問題解決方案

    大量的安全漏洞是由于計算機算術運算的微妙細節(jié)引起的, 具體的C語言, 諸如符號數(shù)和無符號數(shù)之間轉換, 算術運算的越界都會導致不可預知的錯誤和安全漏洞, 具體的案例數(shù)不勝數(shù).
    2012-11-11
  • C++多態(tài)的實現(xiàn)機制深入理解

    C++多態(tài)的實現(xiàn)機制深入理解

    這篇文章主要介紹了C++多態(tài)的實現(xiàn)機制理解的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-07-07
  • protobuf c++編程筆記

    protobuf c++編程筆記

    這篇文章主要介紹了Protobuf的c++編程筆記,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • 如何在 clion 運行多個 main 函數(shù)(方法詳解)

    如何在 clion 運行多個 main 函數(shù)(方法詳解)

    這篇文章主要介紹了如何在 clion 運行多個 main 函數(shù),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • QT+ffmpeg實現(xiàn)視頻解析的示例詳解

    QT+ffmpeg實現(xiàn)視頻解析的示例詳解

    這篇文章主要為大家詳細介紹了如何利用QT+ffmpeg實現(xiàn)視頻解析功能,文中的示例代碼講解詳細,對我們學習Qt有一定幫助,需要的可以參考一下
    2022-09-09
  • C語言實現(xiàn)獲取內(nèi)存信息并輸出的實例

    C語言實現(xiàn)獲取內(nèi)存信息并輸出的實例

    這篇文章主要介紹了C語言實現(xiàn)獲取內(nèi)存信息并輸出的實例的相關資料,需要的朋友可以參考下
    2017-03-03
  • C語言關于二叉樹中堆的創(chuàng)建和使用整理

    C語言關于二叉樹中堆的創(chuàng)建和使用整理

    大家好,這里是針對二叉樹中堆結構的順序儲存,整理出來一篇博客供我們一起復習和學習,如果文章中有理解不當?shù)牡胤?還希望朋友們在評論區(qū)指出,我們相互學習,共同進步
    2022-08-08
  • C語言實現(xiàn)UDP通信

    C語言實現(xiàn)UDP通信

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)UDP通信,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06

最新評論

朝阳县| 岗巴县| 隆回县| 南和县| 辽阳县| 西青区| 镇沅| 谢通门县| 凌云县| 泰顺县| 安塞县| 邓州市| 吴川市| 迭部县| 山东省| 开远市| 林甸县| 汪清县| 青铜峡市| 招远市| 定襄县| 诸暨市| 凉山| 江油市| 苍梧县| 建水县| 温州市| 保山市| 清远市| 永泰县| 盈江县| 遂宁市| 石狮市| 札达县| 延吉市| 大连市| 波密县| 祁门县| 阜新市| 安国市| 江山市|