《剑指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;
    }
};
posted @ 2018-11-02 17:01  兜兜有糖的博客  阅读(188)  评论(0编辑  收藏  举报