/*
* 题目描述
* 在一个二维数组中(每个一维数组的长度相同),
* 每一行都按照从左到右递增的顺序排序,每一列都
* 按照从上到下递增的顺序排序。请完成一个函数,
* 输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:
利用二分查找,左下角的数据为中间点,上面的数据都小于他,右边的数据都大于他,
故可以他为起点进行轮训,大于他向右移动一步,小于他向左移动一步;时间复杂度O(n-1)
* 测试用target 分别为:
* 4 15 20
* 数据:
* 第 1行数据: 1 2 8 9
* 第 2行数据: 2 4 9 12
* 第 3行数据: 4 7 10 13
* 第 4行数据: 6 8 11 15
* 查找过程
* target < input[3][0] == 6 向上移一位
* 查找成功
* target >input[3][0] == 6向右移一位
* target >input[3][1] == 8向右移一位
* target >input[3][2] == 11向右移一位
* 查找成功
* target >input[3][0] == 6向右移一位
* target >input[3][1] == 8向右移一位
* target >input[3][2] == 11向右移一位
* target >input[3][3] == 15向右移一位
* 查找失败
*/
#include <iostream>
#include <vector>
using namespace std;
bool Find(int target, vector<vector<int>>input ){
//数组的行列数
int lineNum = input.size();
int colNum = input[0].size();
//指定行列,从左下角开始,小于目标值向上移动,大于目标值向右移动
for (int i = lineNum-1,j=0; i >=0 && j < colNum;) {
if(input[i][j] == target)
return true;
else if(input[i][j] < target){
cout << " target >input[" << i <<"][" << j << "] == " << input[i][j] <<"向右移一位" << endl;
j++;
}
else if(input[i][j] > target){
cout << "target < input[" << i <<"][" << j << "] == " << input[i][j] << " 向上移一位" << endl;
i--;
}
}
return false;
}
int main()
{
vector < vector < int > > input = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
vector<int> target = {4,15,20};
cout << "测试用target 分别为: " << endl;
for (int i = 0; i < 3; ++i) {
cout << target[i] << " ";
}
cout << endl;
for (int i = 0; i <input.size() ; ++i) {
cout << "第 " << i+1 << "行数据: ";
for (int j = 0; j < input[0].size() ; ++j) {
cout << input[i][j] << " " ;
}
cout << endl;
}
for (int k = 0; k < 3 ; ++k) {
if(Find(target[k],input))
cout << " 查找成功 " << endl;
else
cout << " 查找失败" << endl;
}
return 0;
}