- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564692 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174630
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
34. 在排序数组中查找元素的第一个和最后一个位置- o1 Y- C- W" `2 b' ~/ E8 H1 O
难度中等5 F/ p. A6 x# ~4 s- @
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
" o& t+ p- n2 W如果数组中不存在目标值 target,返回 [-1, -1]。6 |' R: y9 S" J$ Q3 c+ l" f
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。
7 @6 C: Z' H- h( J. d3 [" j
+ h) P0 F- S. N# d. L1 V1 F示例 1:
. s7 @; V. ]& M/ Z输入:nums = [5,7,7,8,8,10], target = 8 V) H1 b* G" P6 _! j# l2 E, P
输出:[3,4]2 @3 z+ c, L* H5 T) m0 X2 w+ h
示例 2:
3 \/ n1 Y' \: k9 D3 {输入:nums = [5,7,7,8,8,10], target = 6
. f5 M2 M. T/ O4 e输出:[-1,-1]& o7 M/ V: l6 M: T7 H5 e
示例 3:( k4 L, m7 O* s; o0 h( o+ f: ]
输入:nums = [], target = 0
. u" z! o0 ^* d( C* @( N* _输出:[-1,-1]
: y& V. x6 I3 @" h5 {, B% x; i3 r6 |1
1 ?! F' [* _# e0 p, f2/ s, X; O/ a/ L l
3
' h Y) Y: G# ?! u46 R* l: v0 y: u
5
1 {: K6 v. h0 D6
# a4 P2 w& ^# ?7
$ ]8 C7 R4 \" \; g- T- H) w8
& r/ L% M. ^+ ^+ t/ |% x91 a% e* Z. f& O3 Y9 n# a I
提示:2 u* Z: |7 Z6 E/ i+ M
2 ~; }6 w: q* _. `7 y( c) v) o) k. R0 <= nums.length <= 10(5)$ W! q& N9 o! f3 Z
-10(9) <= nums[i] <= 10(9)
# y. h' K$ X( O" Cnums 是一个非递减数组0 `, b. }1 ]2 U! s1 ~! P4 N
-10(9) <= target <= 10(9)
' F+ m& X9 ?/ d3 E% X8 ?0 K思路/ j$ m! [ U0 D6 _
关键步骤,与二分查找不同. I$ x! m' \8 c
if(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
' [1 e" S8 ?6 _# \/ z4 atarget==nums[mid]时,不结束循环,继续进入
/ Z1 p+ K& o9 z# W" s* n! U% c- e两个if可以同时进入,寻找界限
/ m8 r+ `9 K0 c, x设置限制,防止mid-1,mid+1越界
! l6 E1 ]+ t' O/ e代码- c: \9 ]" {1 V0 T7 H
class Solution {. t F$ F+ }4 @, ~7 f" }( k7 g
public:: o, B4 U+ C2 ]" {
int left=-1,right=-1;( ]& s# s7 Y3 P5 n. z
vector<int> searchRange(vector<int>& nums, int target) {9 i& |) a; m; a
if(nums.size()==0) return vector<int>{-1,-1};/ }8 O$ t; V. R( O
binary_search(nums,target,0,nums.size());+ ~* N h( G$ x3 ~) F. T& E% i6 I5 X
return vector<int>{left,right};! f" g: N) R" n6 @- X) v; ^. G# E0 b0 }
}* w% a3 q; ^2 ?4 ]& X U, A/ f
void binary_search(vector<int>& nums,int target,int l ,int r){
R j7 ^/ R- w* F& D int mid=(r-l)/2+l;! B' d+ R, i7 Q) V9 _
//printf("%d-%d\n",l,r);
1 j% u# h+ q: v6 C- G if(target==nums[mid]){1 O1 K- G: B0 j0 O" B0 h0 n, b
if(left>mid||left<0) left=mid;) V9 k0 J3 d- l j" C8 B
if(right<mid||right<0) right=mid;% L/ q7 j9 A% E
}
) m# [0 J9 ~4 R) ]# q% A if(l>=r) return;, z! }" i' r) d7 Y
if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);
4 h% V- P4 {/ d. U- v6 A if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r);
) e0 K0 ~8 @ J( B: Z/ C& M }* ~" }3 O8 z7 D, P' @
};, b$ [- b* F% [# t8 b
2 Z: Q( M8 R% r8 Q
————————————————
+ {2 s2 u0 a2 u* V# I ~( G; b& U) Y版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。% ^7 Y( k" u7 R3 p1 a' @/ r/ q
原文链接:https://blog.csdn.net/qq_41735944/article/details/126648832( c1 u1 r1 F+ t+ a
% C9 n# t3 S1 k
! T3 n6 I T$ g% m; d |
zan
|