leetcode34. 在排序数组中查找元素的第一个和最后一个位置
给定一个按照升序排列的整数数组 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. 在排序数组中查找元素的第一个和最后一个位置的更多相关文章
- [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 ...
- LeetCode34.在排序数组中查找元素的第一个和最后一个位置 JavaScript
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- Java实现 LeetCode 34 在排序数组中查找元素的第一个和最后一个位置
在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n ...
- 【LeetCode】34. 在排序数组中查找元素的第一个和最后一个位置
34. 在排序数组中查找元素的第一个和最后一个位置 知识点:数组,二分查找: 题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置 ...
- 34、在排序数组中查找元素的第一个和最后一个位置 | 算法(leetode,附思维导图 + 全部解法)300题
零 标题:算法(leetode,附思维导图 + 全部解法)300题之(34)在排序数组中查找元素的第一个和最后一个位置 一 题目描述 二 解法总览(思维导图) 三 全部解法 1 方案1 1)代码: / ...
- Leetcode题目34.在排序数组中查找元素的第一个和最后一个位置(中等)
题目描述: 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标 ...
- 【LeetCode】34-在排序数组中查找元素的第一个和最后一个位置
题目描述 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值 ...
- LeetCode 34 - 在排序数组中查找元素的第一个和最后一个位置 - [二分][lower_bound和upper_bound]
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
- LeetCode--034--在排序数组中查找元素的第一个和最后一个位置(java)
给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...
随机推荐
- shiro的Quickstart
/** * Simple Quickstart application showing how to use Shiro's API. * * @since 0.9 RC2 */ public cla ...
- PHP CI 框架简单使用(二)
我们简单认识一下CI框架的MVC.示例代码如下 //CI控制器文件Home.php <?php defined('BASEPATH') OR exit('No direct script acc ...
- Kotlin之注释
kotliin中注释和java注释是一样的,支持单行注释和多行注释,但kotlin支持嵌套,java不支持
- Vs code工具汉化
官网为:https://code.visualstudio.com/ 看到中间有一些提示的命令 选择第一条,即Ctrl+shift+P,弹出命令行,选择"Configure Display ...
- python获取豆瓣日记
最近迷上了看了四个春天,迷上了饭叔的豆瓣日记,想全部抓取下来,简单了写了下面的脚本 import urllib.request import os from bs4 import BeautifulS ...
- flutter 屏幕宽高 状态栏高度
MediaQuery.of(context) 包含了一些屏幕的属性: size : 一个包含宽度和高度的对象,单位是dp print(MediaQuery.of(context).size); //输 ...
- linux(centOS7)的基本操作(五) 磁盘、分区、挂载、卸载
linux的磁盘类型和分区简介 linux的磁盘分为IDE和SCSI,目前以后者居多. 1. IDE磁盘的分区:hd+盘号+分区数字 盘号 |-a:基本盘 |-b:基本从属盘 |-c:辅助主盘 |-d ...
- document的属性操作
document对象: 1.直接操作: 对象.属性 = 值; 如下面一段代码: <a href = "...">跳转</a> <script> ...
- 【HANA系列】SAP HANA XS Administration Tool登录参数设置
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS Admi ...
- 【ABAP系列】SAP 一个完整的SAP的Abap例子(idoc,edi文件的相互转换)
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 一个完整的SAP的Aba ...