これは、0以外の値を含むことが予想される行数に依存します。 1000x1000のグリッドに<個の100個の位置があると予想される場合は、値を生成している間に、どの行の情報が0以外であるかの情報を格納する必要があります。
このようなオプションを利用気にいらないthatsの場合:あなたはすでに、検索領域をフィルタリングすることでこれを最適化することができますが、私はそれが唯一のxから高い距離で違いを生むだろうと思う、Y
public void foo() {
int[][]matrix = new int[1000][1000];
int x = 0,y = 0;
if(matrix[x][y] != 0) return;
int min = 0, max=0;
boolean cont = true;
foreverloop:
while(cont) {
min--;max++;
for(int ii = min; ii < max; ii++) {
// secure that min and max dont exeed matrix here.
cont = false;
int[] higherEnd = Arrays.copyOf(matrix[ii], max);
int[] trunk = Arrays.copyOf(higherEnd, higherEnd.length-min);
Arrays.sort(trunk);
if(trunk[trunk.length-1] != 0) {
// HIT! we search this distance but no further.
trunk = Arrays.copyOf(higherEnd, higherEnd.length-min);
int source = trunk.length;
for(int distance = 0; ;distance++) {
if(source-distance>0) {
if(trunk[source-distance] != 0) {
// SCORE!
scoreHit(x+ii,y+source-distance);
break foreverloop;
}
}
if(source+distance<trunk.length) {
if(trunk[source+distance] != 0) {
// SCORE!
scoreHit(x+ii,y+source-distance);
break foreverloop;
}
}
}
}
}
}
}
public void scoreHit(int x, int y) {
// there could be several in nearly the same distances
}