力扣练习——51 搜索二维矩阵

这篇博客讨论了如何高效地在已排序的二维矩阵中查找目标值,利用二分查找的方法。文章提供了问题描述、示例、输入输出说明,并给出了一个查找目标值的场景,最终返回查找结果。
摘要由CSDN通过智能技术生成

51 搜索二维矩阵

1.问题描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。要求使用二分查找。

该矩阵具有如下特性:

每行中的整数从左到右按升序排列。

每行的第一个整数大于前一行的最后一个整数。

示例 1:

输入:

matrix = [

[1, 3, 5, 7],

[10, 11, 16, 20],

[23, 30, 34, 50]

]

target = 3

输出: true

示例 2:

输入:

matrix = [

[1, 3, 5, 7],

[10, 11, 16, 20],

[23, 30, 34, 50]

]

target = 13

输出: false

可使用以下main函数:

int main()

{

vector<vector<int> > matrix;

int target;

int m,n,e;

cin>>m;

cin>>n;

for(int i=0; i<m; i++)

{

    vector<int> aRow;

    for(int j=0; j<n; j++)

    {

        cin>>e;

        aRow.push_back(e);

    }

    matrix.push_back(aRow);

}

cin>>target;

bool res=Solution().searchMatrix(matrix,target);

cout<<(res?"true":"false")<<endl;

return 0;

}
2.输入说明
首先输入matrix的行数m、列数n,

然后输入m行,每行n个整数。

最后输入一个整数target。

3.输出说明
输出true或false
4.范例
输入
3 4
1 3 5 7
10 11 16 20
23 30 34 50
3
输出
true
5.代码

#include <iostream>
#include <queue>
#include <cstdlib>
#include <cstring>

using namespace std;


bool searchMatrix(vector<vector<int> > matrix, int target)
{
	//二分查找判断target是否存在
	//直接将所有行拼接成一行
	int m = matrix.size();//行数
	int n = matrix[0].size();//列数
	if (matrix[0][0] > target || matrix[m - 1][n - 1] < target)//若target不在提供的范围内(不满足大于等于最小值,小于等于最大值)
		return false;
	vector<int>nums;//注意这里不要写成nums(m*n),否则实际长度会变成两倍m*n
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			int tmp = matrix[i][j];
			nums.push_back(tmp);
		}
	}
	//二分查找
	int low = 0;
	int high = m * n - 1;
	while (low <= high)
	{
		int mid = (low + high) / 2;
		if (nums[mid] > target)//左半边寻找
			high = mid - 1;
		else if (nums[mid] < target)
			low = mid + 1;
		else
			return true;
	}
	return false;
}


int main()

{

	vector<vector<int> > matrix;

	int target;

	int m, n, e;

	cin >> m;

	cin >> n;

	for (int i = 0; i < m; i++)

	{

		vector<int> aRow;

		for (int j = 0; j < n; j++)

		{

			cin >> e;

			aRow.push_back(e);

		}

		matrix.push_back(aRow);

	}

	cin >> target;

	bool res = searchMatrix(matrix, target);

	cout << (res ? "true" : "false") << endl;

	return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值