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


    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 > matrix;
    
    int target;
    
    int m,n,e;
    
    cin>>m;
    
    cin>>n;
    
    for(int i=0; i aRow;
    
        for(int j=0; j>e;
    
            aRow.push_back(e);
    
        }
    
        matrix.push_back(aRow);
    
    }
    
    cin>>target;
    
    bool res=Solution().searchMatrix(matrix,target);
    
    cout<<(res?"true":"false")<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    }
    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 
    #include 
    #include 
    #include 
    
    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;
    
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
  • 相关阅读:
    14、三维表面重建-DeepSDF
    OLED显示文字,字母,数字
    一文熟练使用python修改Excel中的数据
    如何创建一个React组件并渲染到DOM中?
    MyBatis总结(2)- MyBatis实现原理(三)
    跨语言指令调优深度探索
    java惠生活网站计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    力扣.82删除链表中的重复元素(java语言实现)
    题目 1240: 生日日数
    03 RocketMQ - Broker 源码分析
  • 原文地址:https://blog.csdn.net/qq_43403657/article/details/126182194