《剑指offer - 题目1》
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
开始想到的是从左上角开始搜索,这样搜索可能重复,可以标记去重。
但是从左下角开始向右上角搜索比较高效。
测试数据集
//[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]] std::vector<std::vector<int>> array = {{1,2,8,9}, {2,4,9,12}, {4,7,10,13}, {6,8,11,15}}; Solution s; cout<<s.Find(15, array);
代码:
#include <stdlib.h> #include <vector> using namespace std; class Solution { public: bool Find(int target, vector<vector<int>> array) { return this->Search2(target, array, (int)(array.size())-1, 0); } bool Search1(int target, vector<vector<int>> array, int x, int y) { if(x < array.size() && y < array[x].size()) { if(target == array[x][y]) { return true; } else if(target > array[x][y]) { return (this->Search1(target, array, x, y+1) || this->Search1(target, array, x+1, y)); } } return false; } //从左下角往上往右的方向寻找,最简单 bool Search2(int target, vector<vector<int>> array, int x, int y) { if(x < array.size() && y < array[x].size()) { if(target == array[x][y]) { return true; } else if(target < array[x][y]) { return this->Search2(target, array, x-1, y); } else { return this->Search2(target, array, x, y+1); } } return false; } };