zoukankan      html  css  js  c++  java
  • 34. 在排序数组中查找元素的第一个和最后一个位置

    题目描述查看:https://leetcode-cn.com/problems/find-first-and-last-position-of-element-in-sorted-array/

      题目的意思是从一个有序的数组中,查找一个数,但是这个数是重复存在的,返回区间。题目要求的时间复杂度O(logn),提醒我们用到二分查找。

    • 思路

    先用二分查找找到这个数,在创建新指针找数的左右边界。

    当找到这个数的时候,设定l,r指针先指向这个数,然后左右扩展找边界。

     1 if(nums[mid] == target) {
     2     int l = mid;
     3     int r = mid;
     4     int i = 0;
     5     while(l >= left && r <= right){
     6         i++;
     7         if((mid-i >=0 && nums[mid -i] ==target) ||( mid + i < nums.length && nums[mid + i] == target)) {
     8             if (mid-i >=0 && nums[mid -i] ==target) l--;
     9             if (mid + i < nums.length && nums[mid + i] == target) r++;
    10         } else {
    11             result[0] = l;
    12             result[1] = r;
    13             return result;
    14         }
    15     }
    16 }
    • 边界条件

    7行要判断数组下标是否越界,然后以mid为中心,以i为左右移动的长度,进行判定。

     1     public static int[] search(int[] nums, int target) {
     2         int[] result = {-1,-1};
     3         if(nums.length == 0)return result;
     4         int left = 0;
     5         int right = nums.length - 1;
     6         while(left <= right){
     7             int mid = left +(right - left)/2;
     8             if(nums[mid] == target) {
     9                 int l = mid;
    10                 int r = mid;
    11                 int i = 0;
    12                 while(l >= left && r <= right){
    13                     i++;
    14                     if((mid-i >=0 && nums[mid -i] ==target) ||( mid + i < nums.length && nums[mid + i] == target)) {
    15                         if (mid-i >=0 && nums[mid -i] ==target) l--;
    16                         if (mid + i < nums.length && nums[mid + i] == target) r++;
    17                     } else {
    18                         result[0] = l;
    19                         result[1] = r;
    20                         return result;
    21                     }
    22                 }
    23             }
    24             else if(nums[mid] > target)right = mid -1;
    25             else
    26                 left = mid +1;
    27             }
    28         return result;
    29     }
  • 相关阅读:
    Java 并发性和多线程
    Java多线程整理
    线程死锁问题
    随机生成长度为len的密码,且包括大写、小写英文字母和数字
    ConcurrentHashMap原理分析
    并发 并行 同步 异步 多线程的区别
    Android与javaScript的交互
    Android6.0 新特性详解
    Android 6.0 新功能及主要 API 变更
    安装 Python-Client
  • 原文地址:https://www.cnblogs.com/vshen999/p/12589449.html
Copyright © 2011-2022 走看看