LeetCode 240. Search a 2D Matrix II 解题报告

LeetCode 240. Search a 2D Matrix II 解题报告

题目描述

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
1. Integers in each row are sorted in ascending from left to right.
2. Integers in each column are sorted in ascending from top to bottom.


示例

Example :
Consider the following matrix:
example
Given target = 5, return true.
Given target = 20, return false.


注意事项

没有明确给出。


解题思路

我的思路:

这道题用到分治的思想,然而怎么进行将问题分为更小的问题直接影响到解决的效率,所以应用分治法时,关键还是找对分的方法。
一开始我的想法每次挑取中间的元素,如果中间的元素比目标元素要大,那么以中间元素为界的右下角的区域就可以直接去除,剩下的是区域再划分成两个子区域进行搜素。然而提交的结果是超时,显然是分的方法出了问题。
正确的划分子问题的方法应该挑取右上角的元素进行比较,如果右上角元素大于目标元素,根据题目矩阵的性质可以知道右上角元素所在列都可以排除,如果右上角元素小于目标元素,同样根据题目给出的矩阵性质可知右上角元素所在行都可以排除,当右上角元素等于目标元素直接返回结果就行,因此算法实现时就是用两个变量row和col表示右上角元素的下标,初始时,row=0,col=matrix[0].size() - 1,当右上角元素大于目标元素,就减少col的值表示排除最右一列,当右上角元素小于目标元素,就增加row的值表示排除最上一行,如果右上角元素等于目标元素就是返回true,否则循环结束后返回false。需要注意的是矩阵为空的情况。


代码

我的代码

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if (matrix.empty())
            return false;

        if (matrix[0].empty())
            return false;

        int row = 0, col = matrix[0].size() - 1;
        while(row < matrix.size() && col > -1) {
            int right = matrix[row][col];

            if (right == target)
                return true;
            else if (right < target)
                row++;
            else 
                col--;
        }

        return false;
    }
};

总结

这道题是使用分治算法,解题关键是想出来用右上角的元素进行比较来逐步减少问题的规模。
这是本周第一道题目,周四的时候会再刷一道题,尽量找关于最短路径的题目,找不到就随便挑一道完成,抓紧时间,努力加油~~

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值