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;
}
}
总耗时: 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 二分查找的更多相关文章
- [01]Binary Search二分查找
Binary Search二分查找 作用:二分查找适用于有序的的数组或列表中,如果列表及数组中有n个元素,通过二分查找查询某一元素的位置需要的步骤是log2(n)(注:该log的底数是2) 1.Pyt ...
- LeetCode 704. Binary Search (二分查找)
题目标签:Binary Search 很标准的一个二分查找,具体看code. Java Solution: Runtime: 0 ms, faster than 100 % Memory Usage ...
- STL模板整理 Binary search(二分查找)
前言: 之前做题二分都是手动二分造轮子,用起来总是差强人意,后来看到STL才发现前辈们早就把轮子造好了,不得不说比自己手动实现好多了. 常用操作 1.头文件 #include <algorith ...
- 【算法模板】Binary Search 二分查找
模板:(通用模板,推荐) 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1. ...
- Leetcode704.Binary Search二分查找
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: num ...
- [LeetCode] Binary Search 二分搜索法
Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...
- 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 ...
- Codeforces Round #678 (Div. 2) C. Binary Search (二分,组合数)
题意:有长度\(n\)的序列,让你构造序列,使得二分查找能在\(pos\)位置找到值\(x\).问最多能构造出多少种排列? 题解:题目给出的\(pos\)是固定的,所以我们可以根据图中所给的代码来进行 ...
- LintCode Binary Search
For a given sorted array (ascending order) and a target number, find the first index of this number ...
随机推荐
- C# Winform中DataGridView的DataGridViewCheckBoxColumn使用方法
下面介绍Winform中DataGridView的DataGridViewCheckBoxColumn使用方法: DataGridViewCheckBoxColumn CheckBox是否选中 在判断 ...
- jquery中简易tab切换
<!doctype html> <html> <head> <title>test</title> <meta content=&qu ...
- json string 与object 之间的转化
1.将json string转化成object 1: public static T GetObjectFromJson<T>(string jsonString) 2: { 3: Dat ...
- Windows7鼠标右键里没有新建文本文件的选项,解决办法
1.“开始”->“运行”,输入"regedit",打开注册表编辑器 2.展开HKEY_CLASSES_ROOT,找到.txt 3.选中.txt,查看右侧窗格的“默认值”是不是 ...
- 命令行参数的处理函数getopt
命令参数 在linux下, shell命令的参数分两种情况: a.参数需要附加信息, 如"wget http://www.abc.com/1.zip -o 1.zip" b.参数不 ...
- 你的数据根本不够大,别老扯什么Hadoop了
本文原名"Don't use Hadoop when your data isn't that big ",出自有着多年从业经验的数据科学家Chris Stucchio,纽约大学柯 ...
- php中const与define的使用区别 详解
1.const用于类成员变量定义,一旦定义且不能改变其值.define定义全局常量,在任何地方都可以访问. 2.define不能在类中定义而const可以. 3.const不能在条件语句中定义常量 i ...
- Entity Framework4.0 (六) EF4的 增加、删除、更改
前面介绍了EF4的查询功能,主要是借助于LINQ的强大的查询功能和它简单的语法.让我们可以完全面向对象集体去进行查询,而不必去劳心处理那些关系型数据库表的操作.这样我们更容易把主要精力集中在业务逻辑上 ...
- iOS 进阶 第三天(0326)
0326 Xib:描述软件界面,轻量级,一般用来描述局部界面 Xib的获取,如下图所示: xib在我们开发的时候叫xib,但如果运行在我们手机里会生成nib.所以xib和nib两种方法来访问xib
- 对象图 Object Diagram
一.用一张图来介绍一下对象图的基本内容 二.对象图与类图的基本区别 三.对象图实例