二維陣列中的查詢問題 三種方法

2021-09-02 07:50:26 字數 1486 閱讀 8406

在乙個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

二維陣列為array,整數字target

一開始我想的是先從行判斷,當target>array[i]並且target所以只需要滿足target>array[i]即可,然後通過for迴圈遍歷

public class solution {

public boolean find(int target, int array) {

//判定特殊情況

if(array.length==0)return false;

if(array[0].length==0)return false;

/for(int i=0;i第乙個數,就進入迴圈

if(target>array[i][0]){

for(int j=1;j相對於第一種,增加了在單行中查詢的技巧——二分查詢,注意二分查詢要用while迴圈,保證不斷二分,而且low<=high

時間是154ms,快了一些

public class solution {

public boolean find(int target, int array) {

int r=array.length;

int l=array[0].length;

if(r==0||l==0)return false;

for(int i=0;i=array[i][0]){

//low與high作為下標,必須在陣列的bound裡面,否則會陣列越界

int low=0;

int high=l-1;

//這裡要小於等於,因為可能存在一開始兩者就相同的情況

while(low<=high){

int mid=(low+high)/2;

if(target>array[i][mid])low=mid+1;

else if(target考慮充分利用條件

左上為最小,右下為最大

左下為行最大,列最小,右上為行最小,列最大

所以找到左下或右上這種屬性相反的情況

然後讓target進行判定,比如找左下**,如果target大,列就加,taget小,行就減**

把大小和行列分別對應起來,就簡單多了

public class solution {

public boolean find(int target, int array) {

int r=array.length;

int l=array[0].length;

if(r==0||l==0)return false;

//初始情況,找左下方的點

int i=r-1;

int j=0;

// 防止陣列越界

while(i>=0&&jarray[i][j])j++;

else if(target時間為152ms

二維陣列中的查詢(三)

題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。樣例輸入陣列 1,2,8,9 2,4,9,12 4,7,10,13 6,8,11,15 如果輸入查詢數值為7,則返回true,如...

二維陣列中的查詢問題

在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。測試用例 7,1,2,8,9 2,4,9,12 4,7,10,13 6,8,11,15 對應輸出應該為 true 思路 首先我們選擇從...

js二維陣列定義和初始化的三種方法

方法一 直接定義並且初始化,這種遇到數量少的情況可以用 var thearray 0 1 0 2 1 1 1 2 2 1 2 2 方法二 未知長度的二維陣列 var tarray new array 先宣告一維 for var k 0 k 給定義的陣列傳入所需的值 tarray 6 1 5 這樣就可...