题目:

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路:

最简单:每一行都使用二分法查找一遍。

更省时间:

二维数组从左到右从上到下递增。
从最后一行找到刚好比target大的位置x,则上一行小于x的角标对应的数均小于target,
移到上一行,在角标x到行末重复上一操作,
以此类推,
每上移一行所需要比较的数字越来越少。
在上述过程中若无法找到相等的数字则不存在。
在每一行找与target接近的数字的过程可以使用二分法,复杂度nlog(n)。

 C++:

#include <iostream>
#include <vector>

using namespace std;

class Solution {
public:
    bool Find(int target, vector<vector<int>> array) {
        int col = array[0].size() - 1;
        int low = 0, high = col;
        int row = array.size()-1;
        for (int i = row; i >= 0; i--) {
            while (low <= high) {
                int media = (low + high) / 2;
                if (target < array[i][media]) {
                    high = media - 1;
                }
                else if (target > array[i][media]) {
                    low = media + 1;
                }
                else {
                    return true;
                }
            }
            //low = 0; 若保留则为每一行均使用简单粗暴的二分法
            high = col;
        }
        return false;
    }
};


int main()
{
    Solution obj;
    int target = 7;
    vector<vector<int>> arr = { {1, 2, 8, 9}, {2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15} };
    cout << obj.Find(target, arr) << endl;
    cin.get();
    cin.get();
    return 0;
}

 Python:

# -*- coding:utf-8 -*-
class Solution:
    def Find(self, target, array):
        row = len(array)-1
        col = len(array[0])-1
        low = 0
        high = col
        for i in xrange(row,-1,-1): # 倒序
            while low<=high:
                media = (low+high)/2
                if target<array[i][media]:
                    high = media-1
                elif target>array[i][media]:
                    low = media+1
                else:
                    return True
            #low = 0 若保留则为吗,每一行均使用二分法直接查找
            high = col
        return False
        
        
if __name__ == '__main__':
    target = 7
    array = [[1, 2, 8, 9], [2, 4, 9, 12], [4, 7, 10, 13], [6, 8, 11, 15]] 
    obj = Solution()
    print obj.Find(target, array)

上述代码在牛客网测试,用时和空间占用分别为:

C++:9ms,1372k

Python:300ms,5860k

posted on 2018-04-20 23:36  想飞的萌猪  阅读(206)  评论(0编辑  收藏  举报