class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if (array.size() == 0) {
return false;
}
int rows = array.size();
int cols = array[0].size();
int j = cols - 1;
int i = 0;
while(i < rows && j >= 0) {
if(array[i][j] < target) {
++i;
}
else if(array[i][j] > target) {
--j;
}
else{
return true;
}
}
return false;
}
};
このアイデアは、我々は、トピックを見て、非常に単純な質問です:
焦点は、上で上から下への昇順にソートされ、ソート各列を昇順の順に左から右に、各行。私たちのアイデアが始まることができます。
- 、の終わりから最初の行から行への最後の行にトラバースされる0
- たびに比較し、目標数字を思い付くし、見つかった場合は返却
true
- 最後に横切った後、目標が見つかっていない、それは偽を返します。
これは可能ですが、2次元配列が非常に大きい場合(おそらく時間複雑になります多くの時間を費やすn^2
対象の要件を満たすことができない場合があり、2次元配列の角張ったとポストによるよりもゴールすることを提供し、)、私たちは、絵の上で焦点に合わせて最適化されなければなりません。
- まず第一に、我々がこの大きなよりも私たちの目標は、あなたが比較のために次の行に直接ジャンプすることができますを見つけるその場合、一番右の桁である行の最後には、この行の最も偉大な人物であることは確かです
- 右端の桁が目標よりも大きい場合、我々が探しているだけをターゲットに決定することができます下の左または上にある、我々は最初の例目標数を見つけるために、左に移動を検討
- 我々は唯一の2例があり、左に移動すると、現在の数は、それが目標数よりも大きい場合、我々は戻って状況に最終的になり、左に行くし続け、ターゲットよりも小さい数字だけでなく、対象の数よりもまだ大きいです、理由は「各列の目標よりも大きな数字は、ダウンした場合、あなたは現在の大規模よりも、次の番号を見つけることができますので、全く同等の数字行われていないと判断できる場合(目標数よりも小さい場合、後者の場合、 、私たちはライン上のデジタル数値目標より決定よりも、採用と最大番号の前にライン上にあるため、トップダウン「の増加のためにと上がった場合にソートされ、ターゲット・フィギュアます確かではない行にしたがって、直接サイクルの終わりオフ、リターン
false
) - 目標数よりも少ない上にデジタルタイムアライメントので、我々はまっすぐに行くように、私たちは、あなたがこれを決定することができるように次の行番号が、同じ列の1行目の数字より大きいかを決定することができるので、最後には、次の行に戻す必要はありません。現在の数よりも右側の数値は、(目標図形が線の右に、行の同じ列により大きな数字オフの右側に現在の行数と数より小さいため)大きくなるように、そして我々は状況に戻ったとき2と同様の手順には、目標より大きいが、目標よりも小さい下向きの動きを動きを残していることが見出されている......
要約すると、我々は、ISを実行する必要があります。
- 上部の行から、右端比較、大きな移動左方から始まる、小の下方への移動
- それはサイクルカットオフである場合(すなわち、境界を越えて)次の最下行より左よりも左に最もを横断するとき、戻り
false