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

版权声明: https://blog.csdn.net/qq_40025335/article/details/89603327

2019.4.27,周日,阴天or雾霾,前两天下完雨后,天真的很蓝啊,今天又,可能这个天才是北京的常态,今天又下了小雨,看看明天的天空,期待,有蓝天

之前刷了几道,忙别的事,断断续续,今天重新开始刷,雷打都不动,~~~~~~~~~~~~~

题目:

二维数组中(每个一维数组长度相同),每行数从左到右递增,每列从上到下递增;

写一个函数,输入上述二维数组和一个整数,判断数组中是否含有该整数;

步骤:

1、构建函数,可以初始化为指定数组 ,C实现,比较简单这里先不贴了

2、输入一整数,并查看该数组

参考:链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e

部分解释:

法1:

把每一行看成有序递增的数组,

利用二分查找,

通过遍历每一行得到答案,

时间复杂度是nlogn

法2:

来源:牛客网

利用二维数组由上到下,由左到右递增的规律,

那么选取右上角或者左下角的元素a[row][col]与target进行比较,

当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col--;

当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;

----------------------------------------------------------------------------------------

上面实现基于左下角查找方法,我实现以下右上角方法:

数组本身是有规律的,选择从数组那个角开始(左上,左下,右上,右下);

实现:

具体二维数组来帮助我们分析问题

A=[1,2,3,4,5

6,7,8,,9,10]

分析:i行j列;数组里右上角数表示为a[i][j](i-0,j=cols)

条件:while i<=rows and j>=0:

Target > a[i][j] ->向下一行移动即i+1

Target < a[i][j]-->向左一列移动即j-1

代码部分:

# 1find-array.py
import numpy as np

class Solution(object):
    """docstring for Solution"""
    def Find(self, target, array):
        #super(Solution, self)Find_()Findtarget,# array = atarget, array        
        # rows = len(array) - 1
        # cols = len(array) - 1  #数的列
        # print(cols)
        rows=array.shape[0] - 1
        cols=array.shape[1] - 1 
        # i = rows
        # j = 0
        i = 0
        j = cols
        
        while i<=rows and j>=0:
            if target < array[i][j]:
                j -=1
            elif target>array[i][j]:
                i +=1
            else:
                return True
        return False


a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
# print("row a:", a.row)
# print("cols a:", a.cols)
d=6
print("d=", d)
b=Solution()
c= b.Find(d, a)
print(c)
 

 

 

猜你喜欢

转载自blog.csdn.net/qq_40025335/article/details/89603327