当前位置:网站首页>【LeetCode每日一题】——34.在排序数组中查找元素的第一个和最后一个位置
【LeetCode每日一题】——34.在排序数组中查找元素的第一个和最后一个位置
2022-08-07 03:10:00 【IronmanJay】
一【题目类别】
- 二分查找
二【题目难度】
- 中等
三【题目编号】
- 34.在排序数组中查找元素的第一个和最后一个位置
四【题目描述】
- 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
- 如果数组中不存在目标值 target,返回 [-1, -1]。
- 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
五【题目示例】
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
六【题目提示】
- 0 < = n u m s . l e n g t h < = 1 0 5 0 <= nums.length <= 10^5 0<=nums.length<=105
- − 1 0 9 < = n u m s [ i ] < = 1 0 9 -10^9 <= nums[i] <= 10^9 −109<=nums[i]<=109
- nums 是一个非递减数组
- − 1 0 9 < = t a r g e t < = 1 0 9 -10^9 <= target <= 10^9 −109<=target<=109
七【解题思路】
- 主要还是二分查找的思路
- 如果数组长度为0说明空数组,直接返回题目要求的结果即可
- 先找左边界,所以要向下取整(mid = (left + right) / 2),向左收缩
- 再找右边界,所以要向上取整(mid = (left + right + 1) / 2),向右收缩
- 主要找完左边界要判断是否找到了,如果没找到返回题目要求的结果即可
- 最后返回左边界和右边界构成的数组
八【时间频度】
- 时间复杂度: O ( l o g 2 N ) O(log_{2}N) O(log2N),其中 N N N为数组元素个数
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
package BinarySearch;
import java.util.Arrays;
public class p34_FindTheFirstAndLastPositionOfAnElementInASortedArray {
public static void main(String[] args) {
int[] nums = {
5, 7, 7, 8, 8, 10};
int[] res = searchRange(nums, 8);
System.out.println("res " + Arrays.toString(res));
}
public static int[] searchRange(int[] nums, int target) {
int[] res = new int[2];
if (nums.length == 0) {
res[0] = -1;
res[1] = -1;
return res;
}
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = (left + right) / 2;
if (nums[mid] >= target) {
right = mid - 1;
} else {
left = mid + 1;
}
}
if (left >= nums.length || nums[left] != target) {
res[0] = -1;
res[1] = -1;
return res;
}
res[0] = left;
left = 0;
right = nums.length - 1;
while (left <= right) {
int mid = (left + right + 1) / 2;
if (nums[mid] <= target) {
left = mid + 1;
} else {
right = mid - 1;
}
}
res[1] = right;
return res;
}
}
- C语言版
#include<stdio.h>
int* searchRange(int* nums, int numsSize, int target, int* returnSize)
{
int* res = (int*)malloc(sizeof(int) * 2);
*returnSize = 2;
if (numsSize == 0)
{
res[0] = -1;
res[1] = -1;
return res;
}
int left = 0;
int right = numsSize - 1;
while (left <= right)
{
int mid = (left + right) / 2;
if (nums[mid] >= target)
{
right = mid - 1;
}
else
{
left = mid + 1;
}
}
if (left >= numsSize || nums[left] != target)
{
res[0] = -1;
res[1] = -1;
return res;
}
res[0] = left;
left = 0;
right = numsSize - 1;
while (left <= right)
{
int mid = (left + right + 1) / 2;
if (nums[mid] <= target)
{
left = mid + 1;
}
else
{
right = mid - 1;
}
}
res[1] = right;
return res;
}
/*主函数省略*/
十【提交结果】
Java语言版

C语言版

边栏推荐
猜你喜欢

X base subtraction

Interview experience with points for job hunting + future career planning

基于FPGA的fir滤波器设计verilog实现

scala object class基础语法讲解

启航C语言,第一个Hello World

Definition and operation process of OAuth2

STM32F103ZET6突然下载不了程序??

Lynk & Co 09phev is fully equipped with active and passive safety features, and it can accelerate from 100 km to 5.6s

83-MongoDB介绍

Definition and operation process of OAuth2
随机推荐
51单片机——暴躁升旗手在线升旗(一款简陋的升旗装置)
如何用WebGPU流畅渲染千万级2D物体:基于光追管线
封装 Encapsulation
多尺度分别融合方法
Let's talk about lock upgrades
STM32 - RTC real-time clock principle + BKP register principle
FutureTask源码深度剖析
84-MongoDB高级介绍
1008: series summation
Wechat applet online learning daily check-in and punch-in project source code introduction
ansible HostName 模块
副本数据库的创建方法
2333. Minimum difference sum of squares - sorting and binary search
2333. 最小差值平方和-排序加二分查找,力扣c语言题解
【诡秘之主】真神篇
梦想照进现实|CSDN 实体奖牌 第二期
KingbaseES V8R3集群管理维护案例之---集群迁移单实例架构
1008: 级数求和
基于STM32F103C8T6最小系统板驱动灰度模块进行循迹
Web Vulnerability Scanner - Burpsuite Routine Test