二维数组中的查找

题目

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,

判断数组中是否含有该整数

思路

选取右上角元素,
元素大于Key-->剔除整列,
元素小于key-->剔除整行

#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

template <class T>
class Find
{
    public:
        void find(vector<vector<T> > v,T num);
};
template <class T>
void Find<T>::find(vector<vector<T> > v,T num)
{
    int row=v.size();
    int r=0;
    int col=v[0].size();
    int c=col-1;
    bool f=false;
    
    /*
     *对于row行 从上0开始递增,停止的条件是小于行的长度
     *对于column列,从右边列的长度开始递减,停止的条件是大于等于零
     *因为查询最右下角的元素时,第0列是允许的不能停止
     */
    while(r<row&&c>=0)
    {
        if(v[r][c]==num)    
        {
            f=true;
            break;
        }
        else if(v[r][c]>num)//行依次增大,列依次增大,要查找的数比这个数小,则肯定在左边 
            --c;
        else//否则,在下边 
            ++r;
    }
    if(f)
        cout<<" 查找成功,横坐标为:" <<r+1<<" 纵坐标为:"<<c+1<<endl;
    else
        cout<<" 查找失败."<<endl;
}

int main()
{
    int n;
    cout<<" 请输入二维数组的大小."<<endl;
    cin>>n;
    
    ifstream in("1.txt");
    vector<vector<int> > v(0,vector<int>(0));
    v.resize(n);
    for(int i=0;i<n;++i)
    {
        v[i].resize(n);
        for(int j=0;j<n;++j)
            in>>v[i][j];
    }
    
    int num;
    cout<<" 请输入要查找的数值."<<endl;
    cin>>num;
    
    Find<int> f;
    f.find(v,num);
    return 0;
}
原文地址:https://www.cnblogs.com/tianzeng/p/10074007.html