剑指Offer面试题目:有序二维数组的查找

来源:互联网 发布:抽象工厂模式特点java 编辑:程序博客网 时间:2024/04/28 19:52

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

解法:先找右上角的元素,若右上角的元素和要查找的元素值相同,则返回true;如果右上角的元素比要查找的元素小,则右上角元素所在的行;如果比要查找的元素大,则剔除右上角元素所在的列。

代码:

#include<iostream>#include<vector>using namespace std;class Solution {public:bool Find() {if (array.empty()){return false;}int row = array.size();int col = array[0].size();int topRight_row = 0;int topRight_col = col-1;while (topRight_row < row && topRight_col >= 0){if (array[topRight_row][topRight_col] == target){cout << "YES" << endl;return true;}else if (array[topRight_row][topRight_col] > target){--topRight_col;}else++topRight_row;}cout << "NO" << endl;return false;}Solution(vector<vector<int> > array, int target){this->array = array;this->target = target;}private:vector<vector<int> > array;int target;};int main(){vector<vector<int> > array(4, vector<int>(4,1));vector<int> v0,v1,v2,v3;v0.push_back(1); v0.push_back(2); v0.push_back(8); v0.push_back(9);v1.push_back(2); v1.push_back(4); v1.push_back(9); v1.push_back(12);v2.push_back(4); v2.push_back(7); v2.push_back(10); v2.push_back(13);v3.push_back(6); v3.push_back(8); v3.push_back(11); v3.push_back(15);array.clear();array.push_back(v0);array.push_back(v1);array.push_back(v2);array.push_back(v3);output2Dvector(array);Solution st(array,5);st.Find();return 0;}
分析:在这个查找过程中,不能选择左上及右下,这样无法剔除行与列,但可以选择左下(这点很容易理解)。

由于每次查找过程中都会剔除一行或一列,所以时间复杂度为O(max(N,M)).而按行列逐个查找的复杂度为O(N*M)




0 0
原创粉丝点击