zoukankan      html  css  js  c++  java
  • [剑指offer] 1. 二维数组中的查找 (数组)

    注意是有序数组!!

    思路:

    1.利用二维数组由上到下,由左到右递增的规律,选取右上角或者左下角的元素a[m][n]与target进行比较,

    当target小于元素a[m][n]时,那么target必定在元素a所在行的左边,即n-1;
    当target大于元素a[m][n]时,那么target必定在元素a所在列的下边,即m+1;
    # -*- coding:utf-8 -*-
    class Solution:
        # array 二维列表
        def Find(self, target, array):
            # write code here
            m=0 
            n=len(array[0])-1 #右上角开始判断
            while m<=len(array)-1 and n>=0:
                if array[m][n]>target:
                    n-=1
                elif array[m][n]<target:
                    m+=1
                else:
                    return True
            return False

    上述m,n的位置不能互换,否则无法通过,以右上角起始位置来判断。

    不过花了295ms, 用java的<1ms !!!

    2.把每一行看成有序递增的数组,利用二分查找,遍历每一行,时间复杂度是nlogn.

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

    注意二分法中,在每行的循环中,再赋值low和high。

    其次注意 千万不要漏掉条件:while low<=high:

    但是速度还是很慢,最终耗时418ms。

  • 相关阅读:
    动态查找>红黑树(RedBlack Tree)
    JSF>表格设置行的颜色
    获取某一天之前或者之后多少天的日期
    java基础>jdbc数据库操作
    java基础>Exception
    数据结构>优先队列(堆)
    java基础>I/O
    java基础>线程 生产者消费者问题
    java基础>泛型
    动态规划>可靠性设计
  • 原文地址:https://www.cnblogs.com/nicetoseeyou/p/10436454.html
Copyright © 2011-2022 走看看