给定一个按照升序排列的整数数组 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]
------------------ 思路:
  这题主要要求时间复杂度是O(log n), 所以对于一个排好序的数组,第一时间想到 二分法查找。
  步骤:1、先用二分法查找,找到一个target,作为一个基准点mid。
     2、从mid往左,二分法查找,找到最左边缘
     3、从mid往右,二分法查找,找到最右边缘 如果不用二分法查找,那就从左右两头往中间靠拢查找,复杂度为O(n)
public int[] searchRange(int[] nums, int target) {
int[] res = new int[2];
int mid = binarySearch(nums, target, 0, nums.length - 1);
if (mid == -1) {
res[0] = -1;
res[1] = -1;
return res;
}
int left = searchRangeLeft(nums, target, 0, mid - 1);
int right = searchRangeRight(nums, target, mid + 1, nums.length - 1);
if (left == -1) {
res[0] = mid;
} else {
res[0] = left;
}
if (right == -1) {
res[1] = mid;
} else {
res[1] = right;
} return res; } private int binarySearch(int[] nums, int key, int start, int end) { //返回查到的下标
if (start > end) {
return -1;
}
int mid = (start + end) / 2;
if (nums[mid] == key) {
return mid;
} else if (nums[mid] > key) {
return binarySearch(nums, key, start, mid - 1);
} else {
return binarySearch(nums, key, mid + 1, end);
}
}
     //往左查找
private int searchRangeLeft(int[] nums, int target, int start, int end) {
if (start > end) { //退出递归条件
return -1;
}
int mid = (start + end) / 2;
if (nums[mid] == target) { //命中,继续从mid往左寻找:1.若未找到,返回mid 2.若找到,返回找到的下标
return searchRangeLeft(nums, target, start, mid - 1) == -1 ? mid : searchRangeLeft(nums, target, start, mid - 1);
} else {//未命中,从mid往右找
return searchRangeLeft(nums, target, mid + 1, end);
}
}
//往右查找
private int searchRangeRight(int[] nums, int target, int start, int end) {
if (start > end) { //退出递归条件
return -1;
}
int mid = (start + end) / 2;
if (nums[mid] == target) {//命中,继续从mid往右寻找。1.若未找到,返回mid 2.若找到,返回找到的下标
return searchRangeRight(nums, target, mid + 1, end) == -1 ? mid : searchRangeRight(nums, target, mid + 1, end);
} else {//未命中, 从mid 往左找
return searchRangeRight(nums, target, start, mid - 1);
}
}

leetcode34. 在排序数组中查找元素的第一个和最后一个位置的更多相关文章

  1. [Swift]LeetCode34. 在排序数组中查找元素的第一个和最后一个位置 | 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 ...

  2. LeetCode34.在排序数组中查找元素的第一个和最后一个位置 JavaScript

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  3. Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置

    在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...

  4. 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置

    34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...

  5. 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题

    零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...

  6. Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)

    题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...

  7. 【LeetCode】34-在排序数组中查找元素的第一个和最后一个位置

    题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...

  8. LeetCode 34 - 在排序数组中查找元素的第一个和最后一个位置 - [二分][lower_bound和upper_bound]

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

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

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

随机推荐

  1. php 发送邮件(1)代码逻辑

    tp3.2 使用phpmailer发送短信邮箱 准备工作 1.thinkphp3.2 2.qq邮箱(开通过POP3/SMTP服务)在qq邮箱内,设置->账户->POP3/IMAP/SMTP ...

  2. 浏览器端-W3School-JavaScript:Screen 对象

    ylbtech-浏览器端-W3School-JavaScript:Screen 对象 1.返回顶部 1. Screen 对象 Screen 对象 Screen 对象包含有关客户端显示屏幕的信息. 注释 ...

  3. MyBatis如何传入多个参数

    一.单个参数 mapper public List<Test> getTestList(String id); xml <select id = "getTestList& ...

  4. 【转】How-to: Enable User Authentication and Authorization in Apache HBase

    With the default Apache HBase configuration, everyone is allowed to read from and write to all table ...

  5. BCNF/3NF 数据库设计范式简介

    数据库设计有1NF.2NF.3NF.BCNF.4NF.5NF.从左往右,越后面的数据库设计范式冗余度越低. 满足后一个设计范式也必定满足前一个设计范式. 1NF只要求每个属性是不可再分的,基本每个数据 ...

  6. flutter 图片圆角

    return Center( child: Container( padding: EdgeInsets.only(left: 10), width: 120, height: 80, child: ...

  7. 考虑以下 Python 代码,如果运行结束,命令行中的运行结果是什么?

    l = [] for i in xrange(10):  l.append({‘num’:i}) print l在考虑以下代码,运行结束后的结果是什么? l = [] a = {‘num’:0} fo ...

  8. [译]深入 NGINX: 为性能和扩展所做之设计

    来自:http://ifeve.com/inside-nginx-how-we-designed-for-performance-scale/ 这篇文章写了nginx的设计,写的很仔细全面, 同时里面 ...

  9. vmnet2访问外网

    1.vmnet2用于内网之间的访问,外部网络访问不了它.它可以访问外网,要想访问外网就必须有真实主机共享网络给它 2.[root@localhost ~]# vim /etc/sysconfig/ne ...

  10. 【嵌入式开发】树莓派h264实时视频监控

    FishXX之前用VLC串流输出视频,在电脑上需要VLC播放器.试了一下,感觉还是有点延时. 今天发现一个更加流畅,也不需要VLC播放器的树莓派远程视频监控方法,直接在浏览器中打开即可. 地址:htt ...