• [leetcode]34.Find First and Last Position of Element in Sorted Array找区间


    Given an array of integers nums sorted in ascending order, find the starting and ending position of a given target value.

    Your algorithm's runtime complexity must be in the order of O(log n).

    If the target is not found in the array, return [-1, -1].

    Example 1:

    Input: nums = [5,7,7,8,8,10], target = 8
    Output: [3,4]

     Example 2:

    Input: nums = [5,7,7,8,8,10], target = 6
    Output: [-1,-1]

    题意:

    给定一个有序数组,找出某个值的起始和终止区间。

    思路:

    二分查找

    代码:

     1 class Solution {
     2     public int[] searchRange(int[] nums, int target) {
     3         // corner case
     4         if(nums == null || nums.length == 0) return new int[]{-1,-1};
     5         int left = findFirst(nums, 0, nums.length-1, target);
     6         if(left == -1) return new int[]{-1,-1};
     7         int right = findLast(nums, 0, nums.length-1, target);
     8         return new int[]{left, right};
     9 
    10     }
    11     // find start point
    12     private int findFirst(int[] nums, int left, int right, int target) {
    13         // avoid dead looping
    14         while(left + 1 < right){
    15             // avoid overflow
    16             int mid =  left + (right - left)/2;
    17             //   left------ |mid| ---target---right 
    18             if(nums[mid] < target){
    19                 left = mid;
    20             }
    21             //   left---target---|mid| ------right 
    22             else{
    23                 right = mid;
    24             }
    25         }
    26         if (nums[left] == target) return left;
    27         if (nums[right] == target) return right;
    28         return -1;
    29     }
    30 
    31     private int findLast(int[] nums, int left, int right, int target) {
    32         while(left + 1 < right){
    33             int mid =  left + (right - left)/2;
    34              //   left---target---|mid| ------right 
    35             if(nums[mid] > target){
    36                 right = mid;
    37             }
    38             //   left------ |mid| ---target---right 
    39             else{
    40                 left = mid;
    41             }
    42         }
    43         if(nums[right] == target) return right;
    44         if (nums[left] == target) return left;
    45         return -1;
    46     }
    47 }
  • 相关阅读:
    String、StringBuilder、StringBuffer的比较
    applet、servlet、jsp分别是什么
    getWriter() has already been called for this response 的解决办法
    servlet 的作用
    什么是 servlet?
    jsp的Session 和Servlet的Session的区别
    java——复用代码、组合、继承(java编程思想)
    Java----访问权限
    CountDownLatch源码分析
    Redis底层数据结构之 zset
  • 原文地址:https://www.cnblogs.com/liuliu5151/p/9137861.html
Copyright © 2020-2023  润新知