- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563259 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174201
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置
) U7 W! t/ F( V: t难度中等
+ L0 j4 h) ?* Y给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
. L# M6 Q8 k7 U/ t- G$ C+ N如果数组中不存在目标值 target,返回 [-1, -1]。
4 j+ ^0 D3 k) S2 s' C: y你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。8 m' D# O/ y7 Y, v" g$ E3 l
0 d+ E& O3 h, a4 J" `9 \示例 1:
: X5 r5 m6 N2 W- B8 ~6 c j( y输入:nums = [5,7,7,8,8,10], target = 8
( p- v% ^# b9 K+ x1 C, E8 A输出:[3,4]
& U4 g6 g7 b0 s& X, I4 h+ s; J) s8 h# `示例 2:
" | i6 S0 z* @' Y' h输入:nums = [5,7,7,8,8,10], target = 6
/ B1 G a# i% J. u V; A输出:[-1,-1]; B: B5 D5 y. g
示例 3:
, q; x- h% Q3 S. _% }, q+ x0 |输入:nums = [], target = 0
$ S8 s8 l( [% g9 d( o& Q输出:[-1,-1]3 f% X* ~/ Y3 F8 D& h% G
1
s4 {# h1 Q3 ~7 u( w2 M6 R9 L. y& Q* h
3
( ~2 z: Q% q% E% g" X4
( d! X6 X8 h! a* B5
4 Z" ]: I2 W+ F( U8 v6
& {: }# Q* [! V, G7
' G. E# y! o% T4 F7 k6 D8' H( f3 g q4 Y3 {4 D
9) O( E! r4 d. L2 L* X. I: W8 U
提示:' K4 F# B$ j/ w
7 _7 T5 b# [* H7 p4 G* y0 <= nums.length <= 10(5): u7 [" g1 {7 t( [0 k
-10(9) <= nums[i] <= 10(9)
% P- L) r5 D8 r. I; z1 r. [' tnums 是一个非递减数组4 P z- z( c2 j& T9 V& q0 E, ?- l
-10(9) <= target <= 10(9)- W4 I+ S9 x# G/ K5 x. P% P
思路. L, h" q0 C; h1 S% C- t O. v
关键步骤,与二分查找不同
# Y% z: U8 P: Q! q+ W6 }if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
$ M( ]. f! K: s( ]$ ptarget==nums[mid]时,不结束循环,继续进入" {, v3 s% L( b7 I( {2 f. g
两个if可以同时进入,寻找界限' H' l9 T% B5 X6 I
设置限制,防止mid-1,mid+1越界
, n C; x0 ?( d/ k7 U5 B代码4 D- i" J6 m# S% s
class Solution {" `/ F; D3 G0 n1 l$ m9 x; Y1 o4 W
public:
, G) _) c1 Z" q: u" E3 S0 Y int left=-1,right=-1;
/ Y: d5 ~ F9 z! _. O vector<int> searchRange(vector<int>& nums, int target) {$ C+ A) E$ H3 w! d6 L0 K2 a. s
if(nums.size()==0) return vector<int>{-1,-1};2 h- f/ N$ g* o. e' \
binary_search(nums,target,0,nums.size());
9 I: B/ l4 P" W7 V% b7 R return vector<int>{left,right};
' _' Y* |# j! E+ d8 X7 C }
3 \- N+ c8 u6 J5 n- Y void binary_search(vector<int>& nums,int target,int l ,int r){/ O' K/ k$ l$ z ~6 `3 ^- X# [6 c
int mid=(r-l)/2+l;
4 m% a0 R/ `7 D8 I //printf("%d-%d\n",l,r);
6 t' D# u2 }0 s if(target==nums[mid]){: v! o& C. |" v. b& P: h
if(left>mid||left<0) left=mid;5 N0 i% @7 G- y6 w+ |& s2 p4 I
if(right<mid||right<0) right=mid;
3 x) ]( K3 h3 W5 h+ Q; g }" ~4 D4 X( i$ Q9 h) t4 x- I/ v
if(l>=r) return;
- X) o) F% z! p, T; `7 A B if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
2 S) {3 }! W$ q) h4 k if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
5 M3 f6 B9 w% S- n: N* } }1 Y) q' Q m) \. D) B
};. b7 u/ |( e! o k) V: B9 K: y
6 h4 q( j/ B' [' ?4 c" G" y0 k3 c————————————————8 Z& p7 F5 x2 m, q5 U( Q$ k( Q1 R& ~
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。$ U$ C! X4 m& N- a
原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488321 r. s4 h4 E9 \/ ^. Z! W4 V
6 c u. f% w2 B1 X' ~/ |
4 a5 H6 k8 D2 f/ I! A' L8 v
|
zan
|