zoukankan      html  css  js  c++  java
  • Search for a range, 在一个可能有重复元素的有序序列里找到指定元素的起始和结束位置

    问题描述:给定一个有序序列,找到指定元素的起始和结束位置。例如:1234555,5,起始4结束6

    算法分析:其实就是一个二分查找的利用。但是特殊就在不是找到某个元素,而是找到下标。也就是在nums[mid]=target时,要分析mid的左右元素。

    public int[] searchRange(int[] nums, int target)
        {
            if(nums == null || nums.length == 0)
            {
                return null;
            }
            int[] arr = {-1,-1};
            binarySearch(nums, 0, nums.length - 1, target, arr);
            return arr;
        }
        
        public void binarySearch(int[] nums, int left, int right, int target, int[] arr)
        {
            int mid = (left + right)/2;
            if(left > right)
            {
                return;
            }
            if(nums[left] == target && nums[right] == target)//特例
            {
                arr[0] = left;
                arr[1] = right;
                return;
            }
            if(nums[mid] == target)
            {
                int templ = mid, tempr = mid;
                while(templ>=left && nums[templ]==target)
                {
                    templ --;
                }
                arr[0] = templ+1;
                while(tempr<=right && nums[tempr]==target)
                {
                    tempr ++;
                }
                arr[1] = tempr-1;
            }
            else if(nums[mid] < target)
            {
                binarySearch(nums, mid + 1, right, target, arr);
            }
            else
            {
                binarySearch(nums, left, mid - 1, target, arr);
            }
        }
  • 相关阅读:
    获取comboBox里面的item使用的方法
    QT格式化代码
    按键槽的写法
    int to String
    sprintf在51单片机中的使用
    学习使用MarkDown
    分享9款超酷的jQuery/CSS3插件
    2014年展望
    操作系统面试
    web一点小结
  • 原文地址:https://www.cnblogs.com/masterlibin/p/5575302.html
Copyright © 2011-2022 走看看