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

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

题目分析:
由于所给的二维数组在一定程度上是有序的,即每一行、每一列都是有序的,但是行与行之间不一定是有序的。如:

1 2 3
2 3 4
3 4 5

第二行的2和第一行的3并不是有序的。
因此,如果从左上角坐标为(0, 0)开始遍历这个二维数组的话,如果当前的数字小于要查找的目标数字,那么要查找的数字就可能出现在当前数字的右边或左边,导致问题变复杂。
相反,如果我们换个思路,从数组的左下角或者右上角开始遍历,以左下角为例,如果当前的数字小于目标数字,那么就往右查找,反之往上查找。这样每次判断完之后只有一个方向需要遍历,问题就变得不复杂了。

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        m, n = len(array), len(array[0])
        i, j = m - 1, 0  # 从左下角开始
        while i >= 0 and j < n:  # 因为我们只会往右、往上走,所以i只会减,j只会加,因此只需要保证i,j不越界即可
            if array[i][j] == target:
                return True
            if array[i][j] > target:  # 目标数字比当前数字小,往上
                i -= 1
            else:  # 目标数字比当前数字大,往右
                j += 1

        return False

原文地址:https://blog.51cto.com/jayce1111/2379101

时间: 2024-11-08 00:49:07

剑指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—二维数组中找数

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

剑指Offer_4_二维数组中的查找

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

剑指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

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

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

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

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

剑指offer_02_二维数组中的查找

#include <iostream> using namespace std; bool ifHasNum(int *data,int row, int col, int num){ if(data == NULL || row <= 0 || col <= 0){ return false; } int i = 0; int j = col - 1; while(i < row && j >= 0){ if(num == data[i * col +

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

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

剑指offer:二维数组的查找

题目:二维数组的查找 思路: 由于二维数组是从左到右,从上到下是递增的,所以可以从右上角或者左下角开始选择, 比如从右上角开始, 右上角的值都比目标值大的话,而右上角所在列的值都比右上角的值大,则所在列排除. 右上角的值都比目标值小的话,而右上角所在行的值都比右上角的值小,则所在行排除. 以此类推,查找会以行或者列的范围进行缩小.直到得到与目标值相同的值或者没有相同值. 图解: 而右上角所在列的值都比目标值大,则排除所在列. 有 图解: 代码: class Solution { public b

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

下决心AC所有剑指offer面试题. 九度OJ面试题地址:http://ac.jobdu.com/hhtproblems.php 书籍:何海涛--<剑指Offer:名企面试官精讲典型编程题> 对于面试题,面试官往往更希望我们能提出优化方法,这样更能体现我们的思维能力以及传说中的"内功".所以做剑指offer要着重训练这方面,多总结多细究,总是有好处的.加油~ 二维数组中的查找 时间限制:1 秒内存限制:32 兆 特殊判题:否提交:19005解决:3642 题目描述: 在一个