zoukankan      html  css  js  c++  java
  • Search for a Range

    Problem

    Given a sorted array of n integers, find the starting and ending position ofa given target value.
    
    If the target is not found in the array, return [-1, -1].

    Example

    Given [5, 7, 7, 8, 8, 10] and target value 8, return [3, 4]

    题解

    lower/upper bound 的结合,做两次搜索即可。

    JAVA:

    import java.io.*;
    class test  
    {
        public static void main (String[] args) throws java.lang.Exception
        {
            int arr[] = {5, 7, 7, 8, 8, 10};
            int target = 8;
            int range[] = searchRange(arr, target);
            System.out.println("range is " + range[0] + " - " + range[1]);
        }
        public static int[] searchRange(int[] A, int target) {
            int[] result = new int[]{-1, -1};
            if (A == null || A.length == 0) return result;
    
            int lb = -1, ub = A.length;
            // lower bound
            while (lb + 1 < ub) {
                int mid = lb + (ub - lb) / 2;
                if (A[mid] < target) {
                    lb = mid;
                } else {
                    ub = mid;
                }
            }
            // whether A[lb + 1] == target, check lb + 1 first
            if ((lb + 1 < A.length) && (A[lb + 1] == target)) {
                result[0] = lb + 1;
            } else {
                result[0] = -1;
                result[1] = -1;
                // target is not in the array
                return result;
            }
    
            // upper bound, since ub >= lb, we do not reset lb
            ub = A.length;
            while (lb + 1 < ub) {
                int mid = lb + (ub - lb) / 2;
                if (A[mid] > target) {
                    ub = mid;
                } else {
                    lb = mid;
                }
            }
            // target must exist in the array
            result[1] = ub - 1;
    
            return result;
        }
    }

    输出:

    range is 3 - 4

    源码分析

    1. 首先对输入做异常处理,数组为空或者长度为0

    2. 分 lower/upper bound 两次搜索,注意如果在 lower bound 阶段未找到目标值时,upper bound 也一定找不到。

    3. 取A[lb + 1] 时一定要注意判断索引是否越界!

    复杂度分析

    两次二分搜索,时间复杂度仍为 O(logn).

  • 相关阅读:
    进程和线程
    进程通信、同步与调度
    文件和文件系统
    【nexys3】【verilog】小设计——拆弹游戏
    Qt4开发环境搭建(Qt4.8.7+mingw4.8.2+Qt Creator4.2.0)
    GPL和LGPL
    【rpi】使用putty远程连接rpi(ssh)
    mysql 命令 小结
    安装mysql zip 安装包 Navicat连接
    python虚拟环境 virtualenv工具
  • 原文地址:https://www.cnblogs.com/lyc94620/p/12182845.html
Copyright © 2011-2022 走看看