【劍指offer】二維數組中的查找(Java)

劍指offer鏈接:二維數組中的查找

題目描述

要求:時間限制:1秒 空間限制:32768K

在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

方法一:直接暴力兩層for循環逐個遍歷比較,直到找到這個整數爲止。時間複雜度:O(n^2)。

public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array == null) {
            return false;
        }
        int first_length = array.length;
        int second_length = array[0].length;
        for(int i = 0; i < first_length; i++) {
            for(int j = 0; j < second_length; j++) {
                if(target == array[i][j]) {
                    return true;
                }
            }
        }
        return false;
    }
}

運行結果:
運行時間:201ms
佔用內存:15984k

方法二:把每一行看成有序遞增的數組,然後用二分查找每一行。時間複雜度:O(nlogn)。

public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array == null) {
            return false;
        }
        int row = array.length;
        for (int i = 0; i < row; i++) {
            int low = 0;
            int high = array[i].length - 1;
            int mid;
            while (low <= high) {
                mid = (low + high) / 2;
                if (target > array[i][mid]) {
                    low = mid + 1;
                }
                else if(target < array[i][mid]){
                    high = mid - 1;
                }
                else {
                    return true;
                }
            }
        }
        return false;
    }
}

運行結果:
運行時間:170ms
佔用內存:15800k

方法三:因爲這個二維數組從左到右、從上到下遞增,我們選取左下角的值a[row][col]和target進行比較:
1.如果target<a[row][col],則要找的數肯定在a所在行的左邊,col–;
2.如果target>a[row][col],則要找的數肯定在a所在列的下邊,row++;
時間複雜度:O(n)。

public class Solution {
    public boolean Find(int target, int [][] array) {
        if(array == null) {
            return false;
        }
        int row = 0;
        int col = array[0].length - 1;
        while (row <= array.length - 1 && col >= 0) {
            if (target > array[row][col]) {
                row++;
            }
            else if (target < array[row][col]) {
                col--;
            }
            else {
                return true;
            }
        }
        return false;
    }
}

運行結果:
運行時間:185ms
佔用內存:16416k

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章