欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

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

這道題要求搜索一個(gè)二維矩陣,由于給的矩陣是有序的,所以很自然的想到要用二分查找法,可以在第一列上先用一次二分查找法找到目標(biāo)值所在的行的位置,然后在該行上再用一次二分查找法來找是否存在目標(biāo)值。對于第一個(gè)二分查找,由于第一列的數(shù)中可能沒有 target 值,該如何查找呢,如果是查找第一個(gè)不小于目標(biāo)值的數(shù),當(dāng) target 在第一列時(shí),會(huì)返回 target 所在的行,但若 target 不在的話,有可能會(huì)返回下一行,不好統(tǒng)一。所以可以查找第一個(gè)大于目標(biāo)值的數(shù),也就是總結(jié)帖中的第三類,這樣只要回退一個(gè),就一定是 target 所在的行。但需要注意的一點(diǎn)是,如果返回的是0,就不能回退了,以免越界,記得要判斷一下。找到了 target 所在的行數(shù),就可以再次使用二分搜索,此時(shí)就是總結(jié)帖中的第一類了,查找和 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;
    }
};

當(dāng)然這道題也可以使用一次二分查找法,如果我們按S型遍歷該二維數(shù)組,可以得到一個(gè)有序的一維數(shù)組,只需要用一次二分查找法,而關(guān)鍵就在于坐標(biāo)的轉(zhuǎn)換,如何把二維坐標(biāo)和一維坐標(biāo)轉(zhuǎn)換是關(guān)鍵點(diǎn),把一個(gè)長度為n的一維數(shù)組轉(zhuǎn)化為 m*n 的二維數(shù)組 (m*n = n)后,那么原一維數(shù)組中下標(biāo)為i的元素將出現(xiàn)在二維數(shù)組中的 [i/n][i%n] 的位置,有了這一點(diǎ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;
    }
};

這道題其實(shí)也可以不用二分搜索法,直接使用雙指針也是可以的,i指向0,j指向列數(shù),這樣第一個(gè)被驗(yàn)證的數(shù)就是二維數(shù)組右上角的數(shù)字,假如這個(gè)數(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;
    }
};

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

相關(guān)文章

  • 老生常談C++ explicit關(guān)鍵字

    老生常談C++ explicit關(guān)鍵字

    這篇文章主要介紹了C++ explicit關(guān)鍵字,explicit關(guān)鍵字只需用于類內(nèi)的單參數(shù)構(gòu)造函數(shù)前面,由于無參數(shù)的構(gòu)造函數(shù)和多參數(shù)的構(gòu)造函數(shù)總是顯式調(diào)用,這種情況在構(gòu)造函數(shù)前加explicit無意義,需要的朋友可以參考下
    2023-03-03
  • Qt出現(xiàn)假死凍結(jié)現(xiàn)象的原因及解決方法

    Qt出現(xiàn)假死凍結(jié)現(xiàn)象的原因及解決方法

    應(yīng)用程序出現(xiàn)假死或凍結(jié)現(xiàn)象通常是由于一些常見問題所導(dǎo)致的,本文主要介紹了Qt出現(xiàn)假死凍結(jié)現(xiàn)象的原因及解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-10-10
  • C++課程設(shè)計(jì)之運(yùn)動(dòng)會(huì)管理系統(tǒng)

    C++課程設(shè)計(jì)之運(yùn)動(dòng)會(huì)管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++課程設(shè)計(jì)之運(yùn)動(dòng)會(huì)管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-10-10
  • 基于Matlab實(shí)現(xiàn)中國象棋的示例代碼

    基于Matlab實(shí)現(xiàn)中國象棋的示例代碼

    中國象棋是起源于中國的一種棋,屬于二人對抗性游戲的一種,在中國有著悠久的歷史。由于用具簡單,趣味性強(qiáng),成為流行極為廣泛的棋藝活動(dòng)。本文將利用Matlab實(shí)現(xiàn)這一游戲,需要的可以參考一下
    2022-02-02
  • 華為云開發(fā)工具CodeArts IDE for C/C++開發(fā)使用指南

    華為云開發(fā)工具CodeArts IDE for C/C++開發(fā)使用指南

    CodeArts IDE是一個(gè)集成開發(fā)環(huán)境(IDE),它提供了開發(fā)語言和調(diào)試服務(wù),本文主要介紹了華為云開發(fā)工具CodeArts IDE for C/C++ 開發(fā)使用指南,感興趣的可以了解一下
    2023-08-08
  • c++??復(fù)制消除問題解決示例詳析

    c++??復(fù)制消除問題解決示例詳析

    這篇文章主要為大家介紹了c++??復(fù)制消除問題解決示例詳析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • VC程序設(shè)計(jì)小技巧20例

    VC程序設(shè)計(jì)小技巧20例

    這篇文章主要介紹了VC程序設(shè)計(jì)小技巧20例,需要的朋友可以參考下
    2014-07-07
  • C++排序算法之插入排序解析

    C++排序算法之插入排序解析

    這篇文章主要介紹了C++排序算法之插入排序解析,將數(shù)組分為有序表和無序表,每次從有序表中取出一個(gè)元素,插入到有序表的適當(dāng)位置,每遍歷一次,有序表中元素增加一個(gè),無序表中元素個(gè)數(shù)減少一個(gè),重復(fù)n-1次,完成排序,需要的朋友可以參考下
    2023-10-10
  • C語言中的BYTE和char深入解析

    C語言中的BYTE和char深入解析

    在C語言中,字符(character)這個(gè)術(shù)語具有兩個(gè)層次上的含義:書寫源程序的字符和程序處理的字符
    2013-10-10
  • 基于C++實(shí)現(xiàn)簡單的日期計(jì)算機(jī)

    基于C++實(shí)現(xiàn)簡單的日期計(jì)算機(jī)

    這篇文章主要為大家詳細(xì)介紹了如何基于C++實(shí)現(xiàn)簡單的日期計(jì)算機(jī),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04

最新評論