トピック1:注文した2次元配列の検索
タイトル説明
(同一の各一次元アレイの長さ)は、上から下に増加する順に、二次元アレイの各列をソートし、ソート昇順の順に左から右へ、各行。完全な機能は、そのような二次元アレイと整数を入力し、配列の整数が含まれているか否かが判断されます。
思考
Aは考えた:暴力アルゴリズム
配列の各要素、比較を横切ります。
時間の複雑さ:O(N * N);
秩序ある配列の条件:に使用されていません
/**
*
* @param target 待查询的目标
* @param array 二维数组
* @return
* 思路:遍历整个二维数组,穷举所有的目标进行比较
* 210ms 16784k
*/
public boolean Find1(int target, int [][] array) {
for(int i=0;i<array.length;i++){//遍历行
for(int j=0;j<array[0].length;j++){//遍历列
if(array[i][j]==target){
return true;
}
}
}
return false;
}
思考2:各行のバイナリ検索を使用して
データの各行が順序付けされているので、一次元規則配列であり、このラインバイナリ検索を実行することができ、時間の複雑さはO(log2n)であります
N個のシーケンシャル使用バイナリサーチの行は、時間計算量は次のとおりO(nlogn)
//193ms
public static boolean Find4(int target,int[][] array){
for(int i=0;i<array.length;i++){//遍历每一行
int left = 0;
int right = array[0].length-1;
int mid = (left+right)/2;
while(left<=right){
mid = (left+right)/2;
if(array[i][mid]>target){//数组中的值比目标值大,则从左半部分再查找
right = mid-1;
}else if(array[i][mid]<target){
left=mid+1;
}else{
return true;//找到
}
}
}
return false;
}
三つのアイデア:トップの右または左下の変換からの比較
行列は、発注されます
ビューの左下隅から、数字を減少させるまで、右の数字は、増加します
あなたは左下隅より大きいデジタル数字を見つけたいときしたがって、左下隅から見て開始します。右;
デジタル時間の左下隅よりもフィギュアを探している場合は、上に移動
左下の右上から順に比較すると
//212ms
public static boolean Find3(int target, int [][] array){
int i=array.length-1; //定义最后一行下标
int j =0;//左下角
while(i>=0 && j<array[0].length) {//
if (array[i][j] > target) {//左下角数字比待比较 数字 大上移
i--;
} else if (array[i][j] < target) {//左下角数字比当前数字小,右移
j++;
} else {
return true;
}
}
return false;
}
暴力アルゴリズム:O(N * N)210ms
インラインバイナリ検索:O(NLOGN)193ms
右下 - 左上:212ms