• 【剑指Offer-数组】面试题4:二维数组中的查找


    题目描述

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    思路1

    从右上角或者左下角一步一步缩小比较范围。假如从右上角开始,设当前数字(右上角)为cur,要查找的数字为target。如果cur==target,则查找成功;如果cur>target,因为数组中的元素从上到下递增排序,所以当前元素cur所在的这一列就不用比较了(该列元素>=cur>target),将当前元素cur所在列删除;如果cur<target,因为数组元素从左到右递增,则当前元素cur所在的这一行就不用比较了(该行元素<=cur<target),将将当前元素cur所在行删除。更新当前元素cur为查找范围修改后右上角的元素,重复前面的过程,直至查找范围为空。

    代码如下:

    class Solution {
    public:
        bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
            if(matrix.empty() || matrix[0].empty()) return false;
            
            int rows = matrix.size();
            int cols = matrix[0].size();
            int r = 0;
            int c = cols-1;
            while(r<rows && c>=0){
                if(matrix[r][c]==target) return true;
                else if(matrix[r][c]>target){
                    c--;
                }else if(matrix[r][c]<target){
                    r++;
                }
            }
            return false;
        }
    };
    

    思路2

    思路 1 是根据当前的位置是否超过的数组的范围来进行循环的,还可以通过是否找到 target 来进行循环。代码如下:

    class Solution {
    public:
        bool findNumberIn2DArray(vector<vector<int>>& matrix, int target) {
            if(matrix.empty() || matrix[0].empty()) return false;
    
            int rows = matrix.size();
            int cols = matrix[0].size();
            int r = 0;
            int c = cols-1;
            while(true){ // 这里使用 while(true)
                if(matrix[r][c]==target) return true;
                else if(matrix[r][c]>target){
                    c--;
                    if(c<0) return false;
                }
                else if(matrix[r][c]<target){
                    r++;
                    if(r>=rows) return false;
                }
            }
            return false;
        }
    };
    
  • 相关阅读:
    switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
    int和Integer有什么区别?
    访问修饰符public,private,protected,以及不写(默认)时的区别?
    Hashmap如何同步?
    Iterator和ListIterator的区别?
    Java的HashMap是如何工作的?
    MyBatis与Hibernate有哪些不同?
    Spring框架中有哪些不同类型的事件?
    Spring的自动装配?
    Spring如何处理线程并发问题?
  • 原文地址:https://www.cnblogs.com/flix/p/12162392.html
Copyright © 2020-2023  润新知