題目:假設存在一個二維數組E,橫向與縱向都是遞增的,現有一個數字T,請計算T是否在E中。
ps:我是android開發者,使用android project 在手機上來測試。
首先構建出測試使用的二維數組E如下:
int[][] array = new int[30][40];
array[0][0] = 0;
for (int i = 0; i < array.length; i++) {
int start = array[0][0]+i;
for (int z = 0; z < array[0].length; z++) {
array[i][z] = start + z;
String out = array[i][z]<10?array[i][z]+" ,":array[i][z]+",";
System.out.print(out);
if(z==array[0].length-1){
System.out.println();
}
}
}
打印出來爲:
11-20 08:33:41.331 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,
11-20 08:33:41.331 1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
11-20 08:33:41.331 2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,
11-20 08:33:41.332 3 ,4 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,
11-20 08:33:41.332 4 ,5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,
11-20 08:33:41.332 5 ,6 ,7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,
11-20 08:33:41.332 6 ,7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,
11-20 08:33:41.332 7 ,8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,
11-20 08:33:41.332 8 ,9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,
11-20 08:33:41.332 9 ,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,
11-20 08:33:41.333 10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,
11-20 08:33:41.333 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,
11-20 08:33:41.333 12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,
11-20 08:33:41.333 13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,
11-20 08:33:41.333 14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,
11-20 08:33:41.333 15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,
11-20 08:33:41.334 16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,
11-20 08:33:41.334 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,
11-20 08:33:41.334 18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,
11-20 08:33:41.334 19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,
11-20 08:33:41.334 20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,
11-20 08:33:41.335 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
11-20 08:33:41.335 22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,
11-20 08:33:41.335 23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,
11-20 08:33:41.335 24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,
11-20 08:33:41.335 25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,
11-20 08:33:41.336 26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,
11-20 08:33:41.336 27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,
11-20 08:33:41.336 28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,
11-20 08:33:41.336 29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,
11-20 08:33:41.338 isInside01 start:329235053454846
11-20 08:33:41.338 isInside01 total time:128802
11-20 08:33:41.338 isInside02 start:329235053608127
11-20 08:33:41.338 isInside02 total time:40625
算法我寫了兩種,遍歷&二分查找,在同一個手機上的消耗時間在前面粘貼出來了。
public static boolean isInside01(int target, int[][] array) {
//final long startT = System.currentTimeMillis();
final long startT = System.nanoTime();
System.out.println("isInside01 start:" + startT);
if (array == null) {
return false;
} else if (!(array.length > 0)) {
return false;
} else {
int tx = 0;
int ty = array.length - 1;
while (tx >= 0 && tx < array[0].length && ty >= 0 && ty < array.length) {
if (target < array[tx][ty]) {
ty--;
} else if (target > array[tx][ty]) {
tx++;
} else {
System.out.println("isInside01 total time:" + (System.nanoTime() - startT));
return true;
}
}
}
return false;
}
public static boolean isInside02(int target, int[][] array) {
long startT = System.nanoTime();
System.out.println("isInside02 start:" + startT);
if (array == null) {
return false;
} else if (!(array.length > 0)) {
return false;
} else {
for (int x = array.length - 1; x >= 0; x--) {
for (int y = array[0].length - 1; y >= 0; y--) {
int temp = array[x][y];
if (target == temp) {
System.out.println("isInside02 total time:" + (System.nanoTime() - startT));
return true;
}
}
}
}
return false;
}