二维有序数组求给定数的位置

2018-04-04  本文已影响13人  西5d

一个二维数组,求给定的元素的位置,这个数组有个特性,是从左到右递增,每行首个从上到下递增,一种是从头开始遍历,另一种根据给定的特性,可以从每行最右侧的元素开始比较,如果小于给定元素,则向下一行找,如果大于给定元素,则从当前行尾元素往行首找,如果相等则返回结果。

现假设数组大小为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;
                }
            }
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读