剑指offer:二维数组的查找

题目:二维数组的查找

思路:

由于二维数组是从左到右,从上到下是递增的,所以可以从右上角或者左下角开始选择,

比如从右上角开始,

右上角的值都比目标值大的话,而右上角所在列的值都比右上角的值大,则所在列排除。

右上角的值都比目标值小的话,而右上角所在行的值都比右上角的值小,则所在行排除。

以此类推,查找会以行或者列的范围进行缩小。直到得到与目标值相同的值或者没有相同值。

图解:

而右上角所在列的值都比目标值大,则排除所在列。

图解:

代码:

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        boolean isFind = false;    //由于测试用例会出现[] 一维空数组,所有不能提前定义矩阵列数 columns = matrix[0].length
        if(matrix!=null&&matrix.length>0&&matrix[0].length>0){
            int row = 0;
            int colunm =matrix[0].length-1;
            while (row<matrix.length&&colunm>=0){
                if(matrix[row][colunm]==target){
                    isFind=true;
                    break;
                }else if(matrix[row][colunm]>target){
                    colunm--;
                }else{
                    row++;
                }
            }
        }
        return isFind;
    }
}

图片来源:https://www.cnblogs.com/edisonchou/p/4737944.html

原文地址:https://www.cnblogs.com/fabaogege/p/10313546.html

时间: 2024-08-16 05:46:34

剑指offer:二维数组的查找的相关文章

剑指offer——二维数组中的查找

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. # -*- coding:utf-8 -*- class Solution: # array 二维列表 def Find(self, target, array): # write code here row=0 col=len(array[0])-1 while(row<len(array)

剑指offer-3.二维数组中查找

0 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列按照从上到下递增顺序排序 请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有这个整数. 1 分析 凡是数组有序的首先要想到的是二分查找. 这个二维数组的特点在于,数组中某个点,在该点,右.下方的数都比该数大.左.上的都比该数小. 但是同时判断两个相同维度,比较麻烦. 因此先判断两个不同的维度.也就是说,判断某个点右面和下面,或是左面和上面.那么其中一个方向是大的,另一个方向是小的. 以判断右面和下面为例: 去左

剑指offer—二维数组中找数

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 基本思想: 首先选取数组中右上角的数字.如果=要找的数字,结束.如果大于要找的数字,剔除这个数字所在的列:如果小于要找的数字,剔除这个数字所在的行. #include <iostream> using namespace std; void find(int a[][4],int rows,int columns,int

剑指Offer——在特殊数组中查找某数

问题:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断该数组中是否含有该整数.比如:在如下二维数组中查找是否有7,若存在,则返回true,否则,返回false. 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 此时,也许我们第一时间看到这个问题会很兴奋,想当然的觉得,如此简单的问题,何必在此浪费时间,不就是进行一次遍历数组嘛..但是再细细的想一想,面试官也不是等闲之辈,不会拿

剑指Offer_4_二维数组中的查找

题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 例 :     1   2    8     9 2   4    9    12 4   7   10   13 6   8   11   15 在这个数组中查找数字 9 ,  则返回true . 查找数子5 ,则返回false . 分析 : 因为二位数组每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺

C#版剑指Offer-001二维数组中的查找

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.例如:下面的二维数组就是每行.每列都递增排序.如果在这个数组中查找数字7,则返回true:如果查找数字5,由于数组不含有该数字,则返回false. 解题思路 看到该题目想到的最简单暴力做的做法就是直接遍历数组查找.但是实际上一般都要用效率更高的做法,该题目有两个重要条件,从左到右递增,从上到下递增

剑指offer----1.二维数组查找

题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:从左下角元素往上查找,右边元素是比这个元素大,上边是的元素比这个元素小.于是,target比这个元素小就往上找,比这个元素大就往右找.如果出了边界,则说明二维数组中不存在target元素. 答案: class Solution { public: bool Find(int target, v

剑指offer--1.二维数组中的查找

题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:从左下角开始寻找,如果小于target,就往右找,如果大于target就往上找. function Find(target, array) { var r = array.length; var c = array[0].length; var i = r-1; var j = 0; whil

剑指Offer1:二维数组中的查找

一:题目描述在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.二:解题思路:target值为要找的数<第1种>暴力搜索,两重for循环遍历.时间复杂度O(n^2)<第2种>从数组最右上或最左下开始.时间复杂度O(n)如图:右上: 如果target值小于当前数组的值,则只用将数组列减一:如果target值大于当前数组的值,则只用将数组行加一.左