- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 569587 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 176099
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
; x* ~; T _: ^4 d" P) h7 A2 N难度中等$ y9 v3 d7 U5 J9 S
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。5 | F8 p' b- O( v7 C5 w# x
如果数组中不存在目标值 target,返回 [-1, -1]。' G0 @! ^( Z9 S& x# _3 W. |* K1 F3 G
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
$ b B1 e2 ~# S& F6 |0 v9 w' m W0 y! [/ Z& F: B; k
示例 1:
( f- N6 A% D! v* M& q2 b输入:nums = [5,7,7,8,8,10], target = 8
# [; @7 F# j! o7 h& u* ^输出:[3,4]; E4 v( e' L+ w5 ^) A) J
示例 2:( u: v7 c1 ]& K* R
输入:nums = [5,7,7,8,8,10], target = 6, ]8 ?$ d/ B6 v# p3 C. x
输出:[-1,-1], C k: o k a. F( J
示例 3:
$ S4 N' E2 _$ Q) S8 Z输入:nums = [], target = 0; `7 @, Q6 |/ ?; K, O1 l: u
输出:[-1,-1]) C( Q5 D2 ^. y% L$ O: |
1 ~; i( o9 {$ |
21 `2 Q; c. g, O. |! x9 S f
3' r9 V/ F: I+ z; a6 ], e
47 b m% v9 Z% b
5
* @- q$ U7 @) g! {0 c/ `6$ Z# i9 O& I9 F5 p7 N
7* M& ^! P& @' C }6 ^' y( ?
8
$ A+ l' G; O* E y9 C9. d! k5 c( y$ r+ B8 y
提示:
4 A {4 U' o- N8 B% x8 z4 Q5 z# _1 t' k& |/ A
0 <= nums.length <= 10(5)
! _! P) G8 d+ L. K& T-10(9) <= nums[i] <= 10(9)2 [6 Z* c( i, w/ z, g6 W
nums 是一个非递减数组
# W0 ^5 r/ c3 T p1 E-10(9) <= target <= 10(9)
( r8 n4 |0 l9 p0 O3 G思路
- N, n& J+ F5 |3 M关键步骤,与二分查找不同6 j! \' g. a) a& \5 H
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);, F; u& A O/ f Y! R& Q8 h# I. ?
target==nums[mid]时,不结束循环,继续进入
6 s1 b0 f* f# O* `9 V2 B两个if可以同时进入,寻找界限 E) @9 |! L' }5 d- y
设置限制,防止mid-1,mid+1越界+ Z0 J* @" H# D5 q2 t+ M
代码" S! l; I, h# @& ^+ _; v! R4 }
class Solution {5 m5 B& I# c4 B* |8 g" e- X
public:& G! H1 O' W# Y4 j. x' `
int left=-1,right=-1;
8 h1 I9 p* k3 Y- L. ~; n vector<int> searchRange(vector<int>& nums, int target) {% } B* U) i4 Z: T6 j/ a3 B
if(nums.size()==0) return vector<int>{-1,-1};9 z# W+ A* E$ v/ S
binary_search(nums,target,0,nums.size());. N; W9 D- a8 b) V7 O# c
return vector<int>{left,right};
4 |8 O! e" z! u5 l4 ^9 R }
0 J: h+ v3 ^% a/ s9 q void binary_search(vector<int>& nums,int target,int l ,int r){, Z9 o! P3 P1 F" J
int mid=(r-l)/2+l;; g1 \& K7 A {! H, w$ J
//printf("%d-%d\n",l,r);
* h7 X& z$ O! m2 _* \/ c if(target==nums[mid]){
- }0 U1 ~0 e3 _7 q0 _2 s* q7 n- `; W if(left>mid||left<0) left=mid;; ~9 G/ c7 |! C: d+ s0 @' q3 d# f
if(right<mid||right<0) right=mid;
" e# p8 A: x2 p% u0 O/ \- j }
8 n; Z: J! z b7 I" V0 \ if(l>=r) return;0 ^0 N+ e$ t* G! c. d1 M
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);" M2 S3 h G" ]
if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
& p" c- [/ H: v" |+ m- ` }9 e* m3 c. C6 x% a4 V
};
+ p a* s9 _' o' [$ I
/ o: k; Y* k P9 W' \. _0 P) V————————————————
( _: [) r! _ h版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
- F# s: D; l, @+ r$ X. J原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832& |+ W; o. O1 B, C, f3 i
2 b7 N% f( M# m
5 p. N8 |) P8 O' h3 }4 }0 i! J$ x+ e |
zan
|