剑指offer 二维数组查找 Python and C++

29 篇文章 0 订阅
11 篇文章 0 订阅

题目描述

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

思路一


从上面的图就可以看出,由于这个题目的特性,右上角和左下角的数有一种特性,通过和target的比较,你只有两条路可以走。在这里起始点是在右上角,通过比较,要么向左要么向下。

做题可能出现的问题

首先是越界问题:
列的起始值是为 len(array[0])-1
其次是while的判断条件问题:
看清楚是哪个变量会接近于0哪个会增加到len(array)
还有区分c++和python中不一样的表达方式,比如取长度,格式,true的大小写。
(如果你发现什么可能会犯的错误,记得私信告诉我哦,爱你哦)

python

# -*- coding:utf-8 -*-
class Solution:
    # array 二维列表
    def Find(self, target, array):
        # write code here
        i, j = 0, len(array[0])-1
        while i<len(array) and j>=0:
            if target > array[i][j]:
                i += 1
            elif target < array[i][j]:
                j -= 1
            else:
                return True
        return False

C++

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int row =0;
        int col = array[0].size()-1;
        while (row< array.size() and col >= 0){
            if (target < array[row][col])
                col--;
            else if (target >  array[row][col])
                row++;
            else
                return true;
        }
        return false;
            
    }
};

思路二

因为从左到右是递增的,那么就可以用二分法来写。

#注意事项
high=mid-1
low = mid +1;

class Solution {
public:
    bool Find(int target, vector<vector<int> > array) {
        int rowcount = array.size();
        int colcount = array[0].size();
        for (int i = 0; i< rowcount; i++){
            int low = 0;
            int high = colcount -1;
            while (low <= high){
                int mid = (low + high)/2;
                if (target < array[i][mid])
                    high=mid-1;
                else if (target > array[i][mid])
                    low = mid +1;
                else
                    return true;
            }
        }
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值