4. 二維數組中的查找(劍指 Offer 題解Java版)

2020-12-24 酷扯兒

本文轉載自【微信公眾號:五角錢的程式設計師,ID:xianglin965】經微信公眾號授權轉載,如需轉載與原文作者聯繫

文章目錄

4. 二維數組中的查找題目連結題目描述解題思路

4. 二維數組中的查找

題目連結

牛客網

https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github

題目描述

給定一個二維數組,其每一行從左到右遞增排序,從上到下也是遞增排序。給定一個數,判斷這個數是否在該二維數組中。

Consider the following matrix:

[

[1, 4, 7, 11, 15],

[2, 5, 8, 12, 19],

[3, 6, 9, 16, 22],

[10, 13, 14, 17, 24],

[18, 21, 23, 26, 30]

]

Given target = 5, return true.

Given target = 20, return false.

Copy to clipboardErrorCopied

解題思路

要求時間複雜度 O(M + N),空間複雜度 O(1)。其中 M 為行數,N 為 列數。

該二維數組中的一個數,小於它的數一定在其左邊,大於它的數一定在其下邊。因此,從右上角開始查找,就可以根據target和當前元素的大小關係來縮小查找區間,當前元素的查找區間為左下角的所有元素。

package 二維數組中的查找;/*

作者 :XiangLin

文件 :FindTarget.java

IDE :IntelliJ IDEA

*/

public class FindTarget {

public boolean Find(int tareget,int[][] martix){

if(martix == null || martix.length == 0 || martix[0].length == 0) //判斷二維數組是否存在

return false;

int rows = martix.length,cols = martix[0].length; //求出二維數組列和行的長度

int r = 0,c = cols - 1; //初始狀態定位到二維數組的右上角

while (r < rows - 1 && c >= 0){

if (tareget == martix[r][c]) //找到目標值的情況

return true;

else if(tareget > martix[r][c]) //目標值比當前大,說明行要增加,往下走

r ++;

else //目標值比當前小,說明列要減小,往左走

c --;

}

return false;

}

public static void main(String[] args) {

FindTarget find = new FindTarget();

int[][] martix = {

{1, 4, 7, 11, 15},

{2, 5, 8, 12, 19},

{3, 6, 9, 16, 22},

{10, 13, 14, 17, 24},

{18, 21, 23, 26, 30}

};

int target = 0;

boolean x = find.Find(target,martix);

System.out.println(x);

}

}

輸出:

false

相關焦點

  • 剪繩子(劍指 Offer 題解Java版)
    如果出現了,就從已經切好長度為 3 的繩子中拿出一段與長度為 1 的繩子重新組合,把它們切成兩段長度為 2 的繩子。證明:當 n >= 5 時,3(n - 3) - n = 2n - 9 > 0,且 2(n - 2) - n = n - 4 > 0。因此在 n >= 5 的情況下,將繩子剪成一段為 2 或者 3,得到的乘積會更大。
  • 重建二叉樹(劍指 Offer 題解Java版)
    假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。解題思路前序遍歷序列的第一個元素 3 就是二叉樹的根節點,中序遍歷序列的根節點 3 把這個序列分成兩半部分,分別是[9]和[20,15,7],左半分部是根節點的左子樹,右半分布是根節點的右,樹。
  • 18.1在 O(1) 時間內刪除鍊表節點(劍指 Offer 題解Java版)
    測試用例功能測試(多個結點鍊表,刪除頭結點、中間結點和尾結點;單個結點鍊表)特殊測試(頭結點或刪除結點為null)package 劍指offer.在O時間內刪除鍊表節點;/*作者 :XiangLin
  • 面向對象編程從小白到王者系列-認識程序中的數組
    有很多老鐵對C#中數組的理解不是很清楚,所以今天我就出一片文章來解釋一下數組這個神秘的東東是什麼,它和我們日常生活中有什麼關係,在日常生活中我們有哪些地方用到。但是在實際的生活中或真正的程序中是不會這樣做的!
  • 用兩個棧實現隊列(劍指 Offer 題解Java版)
    分析棧的特點是先進後出,而隊列的特點是先進先出,主要就是在兩個棧中來回倒騰從而實現隊列的功能,就好像一個黑盒子,裡邊是兩個棧的操作,但其他人在用這個黑盒子的時候,感覺就像在用隊列一樣。隊列和棧只是邏輯性的數據結構,實現隊列和棧可以用數組實現,也可以用鍊表實現,只要滿足隊列先進先出,棧先進後出的特性就可以。
  • Excel中,如何通過關鍵字模糊查找所需要的數據?
    )解釋① 參數一:"*"&D4&"*"* 表示通配符,"*"&D4&"*" 則表示,數據中含有D4單元格的數據② 參數二:A:B表示參數一在參數二的範圍內進行查找③ 參數三:2表示返回數據表 A:B 中的第二列數據,即B列數據④ 參數四:FALSE表示精確查找。
  • 數值的整數次方(劍指 Offer 題解Java版)
    解題思路下面的討論中 x 代表 base,n 代表 exponent。比如,我們求n的32次方,我們先知道n的16次方,在16次方的基礎上再平方就可以,同理,我們可以先求8次方,4次方,2次方,因此我們求32次方就變成了先求平方,在此基礎上求4次方,再求8次方,再求16次方,最後就可以求得32次方。
  • (滾動數組)
    中是用二維dp數組來講解01背包。今天我們就來說一說滾動數組,其實在前面的題目中我們已經用到過滾動數組了,就是把二維dp降為一維dp,一些錄友當時還表示比較困惑。那麼我們通過01背包,來徹底講一講滾動數組!
  • 二進位中 1 的個數(劍指 Offer 題解Java版)
    二進位中 1 的個數題目連結題目描述思路一. 利用Integer類的bitCount()二.二進位中 1 的個數題目連結NowCoder題目描述任意給定一個32位無符號整數n,求n的二進位表示中1的個數,比如n = 5(0101)時,返回2,n = 15(1111)時,返回4這也是一道比較經典的題目了
  • 二叉樹的下一個結點(劍指 Offer 題解Java版)
    tpId=13&tqId=11210&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github題目描述給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回 。
  • 漫畫:什麼是二分查找?(修訂版)
    本次修正了周一發布漫畫中所存在的兩個小問題:1.猜數字遊戲中,大黃報出「175」,小灰應該回答「大了」,而不是「小了」。
  • VBA數組與字典,數組的拆分及條件匹配
    今日繼續和大家分享VBA編程中常用的常用「積木」過程代碼。這些內容大多是我的經驗的記錄,來源於我多年的經驗。最近代碼多是出自」VBA數組與字典解決方案」教程,有一些朋友反映分享的內容不能很好的理解,可以參考這套資料的內容進行研讀。今日分享的是第273期。
  • LabVIEW創建一維數組
    一維數組是最基本的數組,多維數組是在一維數組的基礎上創建的。一維數組的創建過程如下。  (1)創建數組框架。在前面板窗口控制項選板中選擇控制項「新式→數組、矩陣與簇→數組,置於前面板窗口的空白處,如圖1所示。
  • 20.表示數值的字符串(劍指 Offer 題解,面試遇到好多次)
    但是"12e",「1a3.14」,「1.2.3」,"±5"和"12e+4.3"都不是。「5e2」「-123」「3.1416」「-1E-16」false「12e」「1a3.14」「1.2.3」「±5」「12e+4.3
  • C++ Primer Plus (第6版) 中英文版 高清PDF電子書
    《C++ Primer Plus中文版(第6版)》是根據2003年的ISO/ANSI C++標準編寫的,通過大量短小精悍的程序詳細而全面地闡述了C++的基本概念和技術,並專闢一章介紹了C++11新增的功能。《C++ Primer Plus中文版(第6版)》針對C++初學者,書中從C語言基礎知識開始介紹,然後在此基礎上詳細闡述C++新增的特性,因此不要求讀者有C語言方面的背景知識。
  • 入門C語言中的數組,字符串常量與指針
    數組數組聲明為 數據類型 名稱[ constant-size ],並將一個數據類型的一個或多個實例分組到一個可尋址的位置,constant-size可能是一個表達式,但是該表達式必須求值為常量,例如: #define MAX_SIZE 16
  • Arduino小課堂(11)矩陣電子琴與蜂鳴器和數組
    >2、蜂鳴器使用3、tone函數使用4、數組基本使用一、矩陣電子琴矩陣電子琴發出低音la到高音xi的矩陣電子琴電路圖:程序代碼:int num;int yindiao[17] = {0, 220, 247, 262, 294,