zoukankan      html  css  js  c++  java
  • lintcode:Binary Search 二分查找

    题目:

    给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1

    样例

    在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找3,返回2

    挑战

    如果数组中的整数个数超过了2^32,你的算法是否会出错?

    解题:

    利用二分查找,先判断左侧数据,满足条件则查找左侧,左侧不满足的时候在右侧找

    当left>=right 时候表示没有找到返回 -1

    当nums[left] ==target时候最左侧满足条件则找到了

    再判断中位数是否满足条件

    nums[median]==target and nums[median-1]!=target,return median

    else:

    对median的两侧进行判断

    时间复杂度:O(logn)

    Java程序:

    class Solution {
        /**
         * @param nums: The integer array.
         * @param target: Target to find.
         * @return: The first position of target. Position starts from 0.
         */
        public int binarySearch(int[] nums, int target) {
            //write your code here
            if(nums.length==1 && nums[0]== target)
                return 0;
            int numsLen = nums.length;
            int index = binaryFind(nums,target,0,numsLen);
            return index;
        }
        public int binaryFind(int[] nums,int target,int left,int right){
            if(left>=right)
                return -1;
            if(nums[left]==target)
                return left;
            int median = (left+right)/2;
            if(target==nums[median] && target!=nums[median-1])
                return median;
            if(nums[median]>=target)
                return binaryFind(nums,target,left,median);
            else if(nums[median]<target)
                return binaryFind(nums,target,median+1,right);
            return -1;
        }
    }
    View Code

    总耗时: 1504 ms

    发现这里的运行时间,与我本地的网速关系很大。

    直接线性查找,也是很简单的

        public int linFind(int[] nums ,int target){
            int numsLen = nums.length;
            for(int i=0;i<numsLen;i++)
                if(nums[i]==target)
                    return i;
            return -1;
        }
    View Code

    总耗时: 1598 ms

    耗时差不多的

    当数组个数超过232 ,数组的下标是int型,已经越界,很大很大的时候median也会越界

    Python程序:

    class Solution:
        # @param nums: The integer array
        # @param target: Target number to find
        # @return the first position of target in nums, position start from 0 
        def binarySearch(self, nums, target):
            # write your code here
            return self.linFind(nums,target)
            # return self.binaryFind(nums,target,0,len(nums))
        def linFind(self,nums,target):
            for i in range(len(nums)):
                if nums[i]==target:
                    return i
            return -1
            
        def binaryFind(self,nums,target,left,right):
            if left>=right:
                return -1
            if nums[left]==target:
                return left
            median = (left+right)/2
            if nums[median]==target and nums[median-1]!=target:
                return median
            if nums[median]>=target:
                return self.binaryFind(nums,target,left,median)
            elif nums[median]<target:
                return self.binaryFind(nums,target,median+1,right)
            else:
                return -1
    View Code

    两个运行时间,也差不多的。

    总耗时: 314 ms

    总耗时: 303 ms

  • 相关阅读:
    【开发者成长】喧哗的背后:Serverless 的挑战
    都在说实时数据架构,你了解多少?
    谊品生鲜:放弃传统数据库架构,全站上阿里云
    纯干货 | 一篇讲透如何理解数据库并发控制
    作为后端开发如何设计数据库系列文章(二)设计大数据量表结构
    如果千百年前有视觉AI算法,世界将会是什么样的光景呢?
    淘宝万亿级海量交易订单存储在哪?
    跬步千里 —— 阿里云Redis bitfield命令加速记
    容器环境自建数据库、中间件一键接入阿里云 Prometheus 监控
    常用Maven插件介绍(转载)
  • 原文地址:https://www.cnblogs.com/theskulls/p/4865917.html
Copyright © 2011-2022 走看看