题目:

给定一个排序的整数数组(升序)和一个要查找的整数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;
}
}

总耗时: 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;
}

总耗时: 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

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

总耗时: 314 ms

总耗时: 303 ms

lintcode:Binary Search 二分查找的更多相关文章

  1. [01]Binary Search二分查找

    Binary Search二分查找 作用:二分查找适用于有序的的数组或列表中,如果列表及数组中有n个元素,通过二分查找查询某一元素的位置需要的步骤是log2(n)(注:该log的底数是2) 1.Pyt ...

  2. LeetCode 704. Binary Search (二分查找)

    题目标签:Binary Search 很标准的一个二分查找,具体看code. Java Solution: Runtime:  0 ms, faster than 100 % Memory Usage ...

  3. STL模板整理 Binary search(二分查找)

    前言: 之前做题二分都是手动二分造轮子,用起来总是差强人意,后来看到STL才发现前辈们早就把轮子造好了,不得不说比自己手动实现好多了. 常用操作 1.头文件 #include <algorith ...

  4. 【算法模板】Binary Search 二分查找

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

  5. Leetcode704.Binary Search二分查找

    给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: num ...

  6. [LeetCode] Binary Search 二分搜索法

    Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...

  7. 501. Find Mode in Binary Search Tree查找BST中的众数

    [抄题]: Given a binary search tree (BST) with duplicates, find all the mode(s) (the most frequently oc ...

  8. Codeforces Round #678 (Div. 2) C. Binary Search (二分,组合数)

    题意:有长度\(n\)的序列,让你构造序列,使得二分查找能在\(pos\)位置找到值\(x\).问最多能构造出多少种排列? 题解:题目给出的\(pos\)是固定的,所以我们可以根据图中所给的代码来进行 ...

  9. LintCode Binary Search

    For a given sorted array (ascending order) and a target number, find the first index of this number ...

随机推荐

  1. 打造自己的3D全景漫游

    three.js 示例: ​ 打造H5里的"3D全景漫游"秘籍 - 腾讯ISUX ​ QQ物联星球计划 通过pano2vr直接将鱼眼全景图生成立体空间的六个面:也可通过Photos ...

  2. 安卓4.0下rem显示不正常的问题

    在项目中使用了rem为单位,结果在Oppo和4.0下某些浏览器rem工作不正常,font-size计算出来的px总是大于预期的值,因此加了个Hack var docEl = doc.documentE ...

  3. AngularJS(15)-依赖注入

    AngularJS 依赖注入 什么是依赖注入 wiki 上的解释是:依赖注入(Dependency Injection,简称DI)是一种软件设计模式,在这种模式下,一个或更多的依赖(或服务)被注入(或 ...

  4. Sigma.js

    http://www.cnblogs.com/kingboy2008/p/6117741.html

  5. for xml path以及sql合并查询

    sql中for xml path的用法. http://www.cnblogs.com/yanghaibo/archive/2010/06/04/1751405.html

  6. Python脚本控制的WebDriver 常用操作 <十三> 处理button group层的定位

    下面将使用webdriver来定位同一层的按钮 测试用例场景 button group就是按钮组,将一组按钮排列在一起. 处理这种对象的思路一般是先找到button group的包裹(wrapper) ...

  7. 【python】 入门 - 函数式编程

    函数式编程的一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8b ...

  8. visuall assist x 破解方法

    visuall assist x 破解方法   试用期过了后,不管怎么装,或者是找网上的KEY都不行,所以试了一下的方法,成功了: 1.先下载Visual Assist X 10.6.1845.0 2 ...

  9. 键盘样式风格有关设置-iOS开发

    一.键盘风格 UIKit框架支持8种风格键盘. typedef  enum  { UIKeyboardTypeDefault,                 // 默认键盘:支持所有字符 UIKey ...

  10. 调皮的转义之addslashes

    背景: php自5.3版本开始废除set_magic_quotes_runtime函数,并在5.4及以后版本中移除了该函数 今天程序在向mysql插入一个serialize序列化后的数组时,由于一个数 ...