zoukankan      html  css  js  c++  java
  • 二分查找(first-position-of-target)

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

    样例

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

    挑战

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

    解题思路:题目中明确要求了O(logn)的时间,所以其实这个算法要求很明确,就是不断递归利用中位数进行二分查找;同时我们还需要注意的是如果数组中的整数个数超过了2^32,数组的下标就会越界,因为数组的下标是int类型;

    虽说二分法比较简单,大家应该都会,不过这道题一定要注意找的是第一个下标,所以在最后一定要确认target== nums[i]&&target!=nums[i-1]才是真正要找的下标i;

    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&&target==nums[0])   return 0;
            int len = nums.length;
            int index = binaryFind(nums,target,0,len);
            return index;
        }
        public  int binaryFind(int[] nums,int target,int left,int right){
            int median = (left+right)/2;
            if(nums[left]==target)  return left;
            if(left >= right )  return -1;
            if(target == nums[median]&&target != nums[median-1])  return median;
            if(target > nums[median])  return binaryFind(nums,target,median+1,right);
            if(target <= nums[median])  return binaryFind(nums,target,left,median);
            return -1;
        }
    
    }
  • 相关阅读:
    斐波那契数列
    用两个栈实现队列
    从尾到头打印链表
    HDOJ5877(dfs序+离散化+树状数组)
    HDOJ5876(补图的最短路)
    POJ3090(欧拉函数)
    POJ2478(欧拉函数)
    POJ2407(欧拉函数)
    POJ2142(扩展欧几里得)
    POJ3020(最小边覆盖)
  • 原文地址:https://www.cnblogs.com/wangnanabuaa/p/4987304.html
Copyright © 2011-2022 走看看