给定一个按照升序排列的整数数组 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. CentOS 6.4编译安装和部署Zabbix 2.0版本监控(中文)

    [一].zabbix简介 zabbix是一个基于web界面的提供分布式系统监视以及网络监视功能的企业级开元解决方案 zabbix由2部分构成,zabbix_server和可选组件zabbix_agen ...

  2. 造题inginging

    造个题 模拟+sort+贪心 蚕丛及鱼凫,造题何茫然 U74939 小歪被抓走了 代码(不知道对不对哦) #include<bits/stdc++.h> using namespace s ...

  3. ArcGISDynamicMapServiceLayer 和 ArcGISTiledMapServiceLayer 区别

    ArcGISDynamicMapServiceLayer(动态地图服务)通常用于实时显示经常变化的数据,支持控制单个图层可见性,可动态投影.但缺点是显示效果较差,整个服务出图较慢:ArcGISTile ...

  4. Python基本语法_函数属性 & 参数类型 & 偏函数的应用

    目录 目录 前言 软件环境 Python Module的程序入口 函数的属性 Python函数的创建 函数的参数 必备参数 缺省参数 命名参数 不定长参数 匿名参数 偏函数的应用 前言 Python除 ...

  5. c# VirtualKeys

    /// <summary> /// Enumeration for virtual keys taken from http://www.pinvoke.net/default.aspx/ ...

  6. 部署php程序报错解决---TP框架

    1.TP框架中 出现如下错误: 访问网站 http://192.168.0.204/ STORAGE_WRITE_ERROR_:./Runtime/Cache/Home/51620d75af91aa7 ...

  7. GoLand远程Linux开发环境搭建

    Goland 远程调试本文介绍如何从本机的goland连接远端server上的go代码进行调试 goland下载安装 建议购买正版,科学使用自行搜索. 需要安装插件,确保可以访问官网,不然配置下pro ...

  8. mysql中基本的语句

    操作字段: 添加字段 ALTER TABLE 表名 ADD 字段 varchar(20) COMMENT '别名'; 修改表字段的属性等(除了修改表名称) ALTER TABLE 表名 MODIFY  ...

  9. 【VS开发】使用WinPcap编程(3)——设置过滤器

    设置过滤器要用到两个函数,一个是pcap_compile(),另一个是pcao_setfilter().他们的函数原型如下所示: int pcap_compile (pcap_t *p, struct ...

  10. datav轮播表使用事例

    官方事例地址: http://datav.jiaminghi.com/guide/scrollBoard.html 安装: npm install @jiaminghi/data-view 局部引入: ...