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;
        }
    
    }
  • 相关阅读:
    3--jsp编译指令和动作指令
    2-hello world
    1.搭建JSP开发环境
    4-Http通信
    P1879 [USACO06NOV]玉米田Corn Fields
    P3110 [USACO14DEC]驮运Piggy Back
    P2327 [SCOI2005]扫雷
    P1004 方格取数
    P2854 [USACO06DEC]牛的过山车Cow Roller Coaster
    P1353 [USACO08JAN]跑步Running
  • 原文地址:https://www.cnblogs.com/wangnanabuaa/p/4987304.html
Copyright © 2011-2022 走看看