2.二維陣列中的查詢(python和java實現)
阿新 • • 發佈:2019-01-03
題目:在一個二維陣列中,每一行都是按照從左到右遞增的順序排序,每一列都是安裝從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中書否含有該整數。
演算法思想:我們知道每一行都是遞增排序的,每一列也是從上到下遞增排序的,所以左上角的數是最小的,而右下角的數是最大的
1、選取右上角的數;
2,、判斷比較右上角的數和傳入的數值的大小,如果等於該引數的值,查詢結束;
3、如果大於引數,則可以把這一列剔除;
4、如果小於引數,就剔除該數值所在的行
也就是說如果要查詢的數字不在陣列的右上角免責每一次艘在陣列的查詢範圍中提出一行或者一列,這樣每一步就可以縮小範圍,知道找到要查詢的數字,護照額查詢範圍為空
實現程式碼,
python版本:
java版本:# -*- coding:utf-8 -*- class Solution: def Find(self, target, array): n=len(array) flag='false' for i in range(n): if target in array[i]: flag='true' break return flag while True: try: S = Solution() L=list(eval(raw_input())) array=L[1] target=L[0] print(S.Find(target, array)) except: break
思想:因為每一行和每一列都是遞增順序,可以從左下角或者右上角開始,例如從右上角開始,如果比右上角資料大,則行數加一,如果比他小,列數減一
public class Solution { public boolean Find(int target, int [][] array) { //boolean flag=false; int n=array[0].length-1; int i=0; while ((n>=0)&&(i<array.length)){ if (target>array[i][n]) { i++; }else if (target<array[i][n]){ n--; }else{ //flag=true; return true; } } //return flag; return false; } }
方法一:從右上角開始查詢C/C++:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
bool found=false;
int Rows = array.size();
int Cols = array[0].size();
if(Rows>0 && Cols>=0){
int r=0;
int c=Cols-1;
while(r<Rows && c>=0){
if(array[r][c]==target){
found=true;
break;
}
else if(array[r][c]>target){
--c;
}
else
++r;
}
}
return found;
}
};
方法二:從左下角開始查詢C#:
class Solution
{
public bool Find(int target, int[][] array)
{
bool found=false;
//從左下角開始查詢
int rows=array.Length;
int columns=array[0].Length;
if(array!=null&&columns>0 && rows>=0){
int c=0;
int r=rows-1;
while(c<columns && r>=0){
if(array[r][c]==target){
found=true;
break;
}
else if(array[r][c]<target){
++c;
}
else
--r;
}
}
return found;
}
}
測試用例:
1、二維陣列中包含查詢的數字
2、不包含查詢的數字
3、特殊輸入測試(輸入空指標)