一个二维数组,求给定的元素的位置,这个数组有个特性,是从左到右递增,每行首个从上到下递增,一种是从头开始遍历,另一种根据给定的特性,可以从每行最右侧的元素开始比较,如果小于给定元素,则向下一行找,如果大于给定元素,则从当前行尾元素往行首找,如果相等则返回结果。
现假设数组大小为m , n ,注意java里基本类型int是传值的,因此在获得位置的时候,获得结果需要按引用传值。最开始想当然打算用Integer,但是Integer其实内部是final 的基本类型值,一旦生成无法修改,所以这里用了一个HashMap去记录对应的结果。如下代码:
public class ForIndexClazz {
public static void main(String[] args) {
int[][] arr = {{1, 2, 3, 4, 5}, {2, 3, 4, 5, 6}, {4, 5, 6, 9, 10}, {7, 8, 9, 16, 18}};
Map<String, Integer> map = new HashMap<>();
map.put("m", 5);
map.put("n", 4);
indexFor(arr, map, 1);
int m = map.get("m"), n = map.get("n");
if (m != 5 || n != 4) {
System.out.println("index:[" + n + "," + m + "]");
} else {
System.out.println("not found");
}
}
public static void indexFor(int[][] arr, Map<String, Integer> map, int key) {
int m = map.get("m"), n = map.get("n");
for (int i = 0; i < n; i++) {
for (int j = m - 1; j >= 0; j--) {
if (arr[i][j] == key) {
map.put("m", j);
map.put("n", i);
return;
} else if (arr[i][j] < key) {
break;
}
}
}
}
}