• LeetCode--034--在排序数组中查找元素的第一个和最后一个位置(java)


    给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。

    你的算法时间复杂度必须是 O(log n) 级别。

    如果数组中不存在目标值,返回 [-1, -1]

    示例 1:

    输入: nums = [5,7,7,8,8,10], target = 8
    输出: [3,4]

    示例 2:

    输入: nums = [5,7,7,8,8,10], target = 6
    输出: [-1,-1]
     1 class Solution {
     2     public int[] searchRange(int[] nums, int target) {
     3         if(nums == null || nums.length == 0)return new int[]{-1,-1};
     4         return new int[]{findFirst(nums,target),findLast(nums,target)};
     5     }
     6     public int findFirst(int[] nums,int target){
     7         int start = 0;
     8         int end = nums.length - 1;
     9         while(start + 1 < end){
    10             int mid = (end - start) / 2 + start;
    11             if(nums[mid] < target){
    12                 start = mid;
    13             }else{
    14                 end = mid;
    15             }
    16         }
    17         if(nums[start] == target) return start;
    18         if(nums[end] == target) return end;
    19         return -1;
    20     }
    21     public int findLast(int[] nums,int target){
    22         int start = 0;
    23         int end = nums.length - 1;
    24         while(start + 1 < end){
    25             int mid = (end - start) / 2 + start;
    26             if(nums[mid] > target){
    27                 end = mid;
    28             }else{
    29                 start = mid;
    30             }
    31         }
    32         if(nums[end] == target) return end;
    33         if(nums[start] == target) return start;  
    34         return -1;
    35     }
    36     
    37 }

    方法2:(unpassed) 长度小于3会有错误

     1 class Solution {
     2     public int[] searchRange(int[] nums, int target) {
     3         if(nums == null || nums.length == 0)return new int[]{-1,-1};
     4         if(nums.length == 1 && nums[0] == target) return new int[]{0,0};
     5         int start = 0,end = nums.length -1;
     6         boolean flag = false;
     7         while(start+1<end ){
     8             int mid = (end - start) / 2  + start;
     9             if(nums[mid] < target){
    10                 start = mid;
    11             }else if(nums[mid] > target){
    12                 end = mid;
    13             }else{
    14                 flag = true;
    15                 start = mid;
    16                 end = mid;
    17                 while(start >= 0 && nums[start] == target){
    18                     start--;
    19                 }
    20                 while(end < nums.length && nums[end] == target){
    21                     end++;
    22                 }
    23                 start++;
    24                 end--;
    25                 break;
    26             }
    27         }
    28         if(flag == true){
    29             return new int[]{start,end};
    30         }
    31         return new int[]{-1,-1};
    32     }
    33     
    34     
    35 }

    2019-04-27 19:51:51

  • 相关阅读:
    USACO 3.3.1 Riding the Fences 骑马修栅栏(欧拉回路)
    USACO 3.2.6 Sweet Butter 香甜的黄油(最短路)
    USACO 1.3.4 Prime Cryptarithm 牛式(模拟枚举)
    USACO 1.3.3 Calf Flac(Manacher算法)
    USACO 1.2.2 Transformations 方块转换
    小希的迷宫(并查集判环)
    Is It A Tree?(并查集)
    Manacher算法——求最长回文子串
    Live Love(思维)
    Longge's problem(欧拉函数应用)
  • 原文地址:https://www.cnblogs.com/NPC-assange/p/10779949.html
Copyright © 2020-2023  润新知