LintCode -- 457 · 经典二分查找问题

描述:

在一个排序数组中找一个数,返回该数出现的任意位置,如果不存在,返回 -1。

测试样例:

样例
样例 1:

输入:nums = [1,2,2,4,5,5], target = 2
输出:1 或者 2
样例 2:

输入:nums = [1,2,2,4,5,5], target = 6
输出:-1

分析:

看完题目描述,我立马想到了循环遍历,找到数组中第一个和目标值相同的值返回下标值即可

public int findPosition(int[] nums, int target) {
        // write your code here
        if(nums==null){
            return -1;
        }
        for(int i=0;i<nums.legnth;i++){
        	if(nums[i]==target){
        		return i;
        	}
        }
        return -1;
    }

时间复杂度是O(n),所以头提交之后报超时了,然后又好好看了一遍题目,时间复杂度要求是O(logn) ,并且给定的数组是有序的,不要求数组的值和目标值相同的时候返回的下标值是第几个,那使用二分查找,确定左边界值head(开始为0)和右边界值tail(数组的长度-1),计算出中间值mid=(tail+head)/2,将中间值和目标值比较,大于中间值则将区间缩小到中间值右边区间,左边界值变成mid+1;小于中间值则将区间缩小到左边区间,右边界值变成mid-1;如果刚好中间值等于目标值,则返回下标值即可;查找到最后,如果中间值超出边界值了还没找到,则返回-1;

解决方案:

给出代码如下:
我用的是循环,有兴趣的小伙伴也可以自己写递归函数

public class Solution {
    /**
     * @param nums: An integer array sorted in ascending order
     * @param target: An integer
     * @return: An integer
     */
    public int findPosition(int[] nums, int target) {
        // write your code here
        if(nums==null){
            return -1;
        }
        int head=0;
        int tail=nums.length-1;
        int mid=(head+tail)/2;
        while(mid>=head&&mid<=tail){
            if(target==nums[mid]){
                return mid;
            }
            if(target<nums[mid]){
                tail=mid-1;
            }
            if(target>nums[mid]){
                head=mid+1;
            }
            mid=(tail+head)/2;
        }
        return -1;
    }
}

提交结果:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值