zoukankan      html  css  js  c++  java
  • LeetCode刷题记录-34

     这题一看:升序、时间复杂度的要求:O(log n),就有思路了:典型的二分查找嘛!

    先用二分查找找到target所在下标,考虑到target重复的情况,定义左右两个指针,他们同时从找到的下标位置出发,一个向左,一个向右,直到找到不等于target的下标位置即可

     1 public static int[] searchRange(int[] nums, int target) {
     2         //排除特殊数据:数组为空,长度为0、1
     3         if (nums == null || nums.length == 0) {
     4             return new int[]{-1, -1};
     5         }
     6         if (nums.length == 1) {
     7             if (nums[0] == target) {
     8                 return new int[]{0, 0};
     9             } else {
    10                 return new int[]{-1, -1};
    11             }
    12         }
    13         //排除完毕,开始二分查找,index是查找结果,flag标记是否查找成功,默认false
    14         int low = 0, high = nums.length - 1;
    15         int index = 0;
    16         boolean flag = false;
    17         while (low <= high) {
    18             int mid = (low + high) / 2;
    19             if (target == nums[mid]) {
    20                 index = mid;
    21                 flag = true;
    22                 break;
    23             } else if (target > nums[mid]) {
    24                 low = mid + 1;
    25             } else {
    26                 high = mid - 1;
    27             }
    28         }
    29         //没有找到target
    30         if (flag == false) {
    31             return new int[]{-1, -1};
    32         }
    33         //以target的下标index为中心,向左,向右分别遍历,找到边界
    34         int left = index - 1, right = index + 1;
    35         while (left >= 0 && nums[left] == target) {
    36             left--;
    37         }
    38         while (right < nums.length && nums[right] == target) {
    39             right++;
    40         }
    41         return new int[]{left + 1, right - 1};
    42     }

     运行结果:

  • 相关阅读:
    HDU 1394 Minimum Inversion Number 线段树
    POJ 2777 Count Color 线段树
    POJ 2828 Buy Tickets 线段树
    POJ 2528 Mayor's posters 线段树+离散化
    HDU 1166 敌兵布阵 线段树的基本应用——动态区间和问题
    【转】ACM blog 汇总
    【转】ACM资源
    【链表】关于链表的内存池
    C语言文件操作 fseek ,fread,rewind
    【转】任意进制转换--(62进制)
  • 原文地址:https://www.cnblogs.com/gilgamesh-hjb/p/13340614.html
Copyright © 2011-2022 走看看