【简单】Lintcode 14: 二分查找

本文介绍了一种在已排序的整数数组中查找特定目标值首次出现位置的方法,并提供了两种实现该功能的Java代码示例。算法采用二分查找策略,确保了O(logn)的时间复杂度。

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

样例

样例  1:
	输入:[1,4,4,5,7,7,8,9,9,10],1
	输出: 0
	
	样例解释: 
	第一次出现在第0个位置。

样例 2:
	输入: [1, 2, 3, 3, 4, 5, 10],3
	输出: 2
	
	样例解释: 
	第一次出现在第2个位置
	
样例 3:
	输入: [1, 2, 3, 3, 4, 5, 10],6
	输出: -1
	
	样例解释: 
	没有出现过6, 返回-1

挑战

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


解题思路:

public 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(target>nums[nums.length-1] || target<nums[0])
            return -1;
        
        int l = 0 , r = nums.length-1;
        int res = -1;
        
        while(l <= r){
            int mid = (r-l)/2+l;
            
            if(nums[mid] == target){
                res = mid;
                break;
            }
            else if(nums[mid] > target)
                r = mid-1;
            else
                l = mid+1;

        }
        
        while(res>0 && nums[res-1]==target)
            res--;
        
        return res;
    }
}

JAVA代码2:

public 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(target>nums[nums.length-1] || target<nums[0])
            return -1;
        
        int l = 0 , r = nums.length-1;
        int mid = (r-l)/2+l;
        
        while(l < r){
            if(nums[mid] >= target)
                r = mid;
            else
                l = mid+1;

            mid = (r-l)/2+l;
        }
        
        if(nums[mid] == target)
            return mid;
        else
            return -1;
    }
}

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值