题目
在一个二维数组array中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
给定 target = 7,返回 true。
给定 target = 3,返回 false。
数据范围:矩阵的长宽满足 0 ≤ n , m ≤ 500 , 矩阵中的值满足 0 ≤ val ≤ 10910^9109
进阶:空间复杂度:O(1) ,时间复杂度: O(n+m)
示例1
输入:7,[[1,2,8,9],[2,4,9,12],[4,7,10,13],[6,8,11,15]]
输出:true
说明:存在7, 返回true
示例2
输入:1,[[2]]
输出:false
算法实现
#include <iostream>
#include <vector>
using namespace std;
//输入数组数据
vector<vector<int>> Array() {
cout << "输入数组长宽,并输入数据:" << endl;
int wh, val;
cin >> wh; //二维数组长宽
vector<vector<int>> arr(wh, vector<int> (wh)); //创建一个长宽wh的二维数组
for (int i = 0; i < wh; i++) { //外层行,内层列(逐行输入)
for (int j = 0; j < wh; j++) {
cin >> val;
arr[i][j] = val; //赋值
}
}
return arr; //返回二维数组
}
//二分查找目标元素(这里合法区间采用左闭右闭)
bool binarySearch(vector<int> arr, int target) {
int left = 0, right = arr.size() - 1;
while (left <= right) {
int mid = left + ((right - left) >> 2);
if (target > arr[mid]) left = mid + 1; //更新查找区间
else if (target < arr[mid]) right = mid - 1;
else return true; //成功找到返回
}
return false;
}
int main() {
vector<vector<int>> arr = Array(); //创建二维数组
cout << "输入查找值:";
int target; //查找值
cin >> target;
for (auto it : arr) { //it是复制的一份
if(binarySearch(it, target)) cout << "成功找到";
}
return 0;
}