首页 > 试题广场 >

找出指定数在数组中的范围

[编程题]找出指定数在数组中的范围
  • 热度指数:770 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
输入一个排好序的整数数组,找到指定目标数的开始和结束位置。如果指定的数字不在数组中,则输出 [-1,-1]。例如,输入数组为[5, 7, 7, 8, 8, 10], 目标数为8, 输出[3, 4].本题会人工判题,要求时间复杂度O(logn)

输入描述:
输入数据包括两行:
第一行两个整数n(1 ≤ n ≤ 10 ^ 5),和需要查找的数target
第二行n个整数,范围均在32位整数内,以空格分隔


输出描述:
输出格式为[begin,end],如果不存在就输出[-1,-1]
示例1

输入

6 8 5 7 7 8 8 10

输出

3 4
leetcode 34题
import java.util.*; public class Main{     public static void main(String[] args){         Scanner scan = new Scanner(System.in);         int n = scan.nextInt();         int target = scan.nextInt();         scan.nextLine();         int[] nums = new int[n];         for(int i=0; i<n; i++){             nums[i] = scan.nextInt();         }         System.out.println("["+searchRange(nums,target)[0]+","+searchRange(nums,target)[1]+"]");     }     public static int[] searchRange(int[] nums, int target) {         int[] ans = {-1,-1};         if(nums == null || nums.length == 0) return ans;         int low = 0, high = nums.length-1;         if(low == high && nums[0] == target) return new int[] {0,0};         while(low < high){             int mid = low + (high-low)/2;             if(nums[mid] < target){                 low = mid + 1;             }else{                 high = mid;             }             if(low == high && nums[low] == target){                 ans[0] = low;             }         }         low = 0; high = nums.length-1;         while(low < high){             int mid = low + (high-low+1)/2;             if(nums[mid] > target){                 high = mid - 1;             }else{                 low = mid;             }             if(low == high && nums[low] == target){                 ans[1] = low;             }         }         return ans;     } }
编辑于 2018-03-20 10:45:28 回复(0)