LintCode 14. 二分查找

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

样例

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

挑战

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

解:标准的二分查找

注意,最后一个else即找到target,但是target的值在数组中有多个,应返回下标最小的一个(else里的while实现这一效果)。

class Solution {
public:
    /**
     * @param nums: The integer array.
     * @param target: Target number to find.
     * @return: The first position of target. Position starts from 0.
     */
    int binarySearch(vector<int> &array, int target) {
        // write your code here
        int hi=array.size();
        int mid,low;
        low=0,mid=(hi+low)/2;
        while(low<=hi)
        {
            if(target>array[mid])
            {
                low=mid+1;
            }
            else if(target<array[mid])
            {
                hi=mid-1;

            }else
            {
                while(mid-1>=0&&array[mid-1]==array[mid])
                {
                    mid=mid-1;
                }
                return mid;
            }
            mid=(hi+low)/2;
        }

        return -1;
    }
};

原文地址:https://www.cnblogs.com/zslhg903/p/8361915.html

时间: 2024-11-02 06:24:06

LintCode 14. 二分查找的相关文章

lintcode——排序列表转换为二分查找树(链表,二叉排序树)

中等 排序列表转换为二分查找树查看运行结果 27% 通过 给出一个所有元素以升序排序的单链表,将它转换成一棵高度平衡的二分查找树 您在真实的面试中是否遇到过这个题? Yes 样例 标签 Expand 相关题目 Expand 思路: 这道题将排好序的链表转化为二叉排序树,即左子树<根节点<右子树 采用递归的方法,在链表上选取中间点作为根节点, 每次传入的参数为,需要创建的根节点的指针(这里由于要改变指针的值,所以要传入指针的指针),链表开始指针,结尾指针,链表结点个数( 这里传入了个数之后,就不

LintCode刷题---二分查找

描述: 给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开         始),如果target不存在于数组中,返回-1. 样例 : 输入: [1, 2, 3, 3, 4, 5, 10], 3 输出: 2 样例解释:  3 第一次出现在第2个 解题: 难点分析: 注意数组中存在着重复数据, 而利用二分查找找出来的数据不一定是第一个, 数据需要检验. public int binarySearch(int[] nums,

二分查找总结及部分Lintcode题目分析 1

进行二分查找课程回顾与总结,包括以下几个方面,二分法的模板总结和解题思路.应用. 二分法模板总结classical binary search: 1. 必须要做的排除极端情况,也就是数组(用A表示)不存在即A == None或者 A为空,即len(A) == 0 的情况. 2. 二分法核心找的是mid值,并判断这个mid是否跟我们要找的target一致,或者和target之间的关系,所以要先判断start和end.为start和end赋值,start = 0, end = len(A) - 1

二分查找总结

最近刷leetcode和lintcode,做到二分查找的部分,发现其实这种类型的题目很有规律,题目大致的分为以下几类: 1.最基础的二分查找题目,在一个有序的数组当中查找某个数,如果找到,则返回这个数在数组中的下标,如果没有找到就返回-1或者是它将会被按顺序插入的位置.这种题目继续进阶一下就是在有序数组中查找元素的上下限.继续做可以求两个区间的交集. 2.旋转数组问题,就是将一个有序数组进行旋转,然后在数组中查找某个值,其中分为数组中有重复元素和没有重复元素两种情况. 3.在杨氏矩阵中利用二分查

Search in Rotated Sorted Array, 查找反转有序序列。利用二分查找的思想。反转序列。

问题描述:一个有序序列经过反转,得到一个新的序列,查找新序列的某个元素.12345->45123. 算法思想:利用二分查找的思想,都是把要找的目标元素限制在一个小范围的有序序列中.这个题和二分查找的区别是,序列经过mid拆分后,是一个非连续的序列.特别要注意target的上下限问题.因为是非连续,所以要考虑上下限,而二分查找,序列式连续的,只用考虑单限.有递归算法和迭代算法. 递归算法: 1 public int search(int[] nums, int target) 2 { 3 retu

River Hopscotch-[二分查找、贪心]

Description Every year the cows hold an event featuring a peculiar version of hopscotch that involves carefully jumping from rock to rock in a river. The excitement takes place on a long, straight river with a rock at the start and another rock at th

Java学习 (七)、数组,查找算法,二分查找法,冒泡排序,选择排序,插入排序

一.常用数组查找算法 工作原理:它又称为顺序查找,在一列给定的值中进行搜索,从一端的开始逐一检查每个元素,知道找到所需元素的过程. 例1:查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1 1 import java.util.Scanner; 2 public class LinearSearch{ 3 public static void main(String []argas) 4 { 5 int [] array={10,100,90,65,80,92}; 6 System.o

Java学习之二分查找算法

好久没写算法了.只记得递归方法..结果测试下爆栈了. 思路就是取范围的中间点,判断是不是要找的值,是就输出,不是就与范围的两个临界值比较大小,不断更新临界值直到找到为止,给定的集合一定是有序的. 自己写的代码: 1 package com.gh; 2 3 import java.util.Arrays; 4 /** 5 * 二分查找算法实现 6 * @author ganhang 7 * 8 */ 9 public class Search { 10 public static void mai

K-th Number 线段树(归并树)+二分查找

K-th Number 题意:给定一个包含n个不同数的数列a1, a2, ..., an 和m个三元组表示的查询.对于每个查询(i, j, k), 输出ai, ai+1, ... ,aj的升序排列中第k个数 . 题解:用线段树,每个节点维护一个区间并且保证内部升序,对于每次查询x,返回该区间小于x的数的个数.就这样不断二分,直到找到x为止. 线段树(归并树)+二分查找 1 #include <iostream> 2 #include <cstdio> 3 #include <