题目:
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:
最简单:每一行都使用二分法查找一遍。
更省时间:
二维数组从左到右从上到下递增。
从最后一行找到刚好比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