34. 在排序数组中查找元素的第一个和最后一个位置+ O' s2 v( |3 W& S
难度中等1 Q. N. o$ i2 n! D: d Z$ x
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 ! l0 ?3 c' O+ j# }4 T% N. k如果数组中不存在目标值 target,返回 [-1, -1]。$ R6 u6 U. L, v. N
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。( A% `# i$ r/ {' n/ y2 L
: J) I/ `/ U- g示例 1:, x) q x5 R, N" R5 v, g$ M0 h
输入:nums = [5,7,7,8,8,10], target = 8 ; H7 z$ S6 a* d$ {, O输出:[3,4]# s0 v) _- M, H4 s
示例 2:- E: d8 t# d! X! E# u: e% [1 z
输入:nums = [5,7,7,8,8,10], target = 6' @3 ^8 F1 [5 B1 s2 J: `
输出:[-1,-1], a- p D5 j/ W9 Q7 k7 y
示例 3:4 @( d; C0 T5 U$ S. B
输入:nums = [], target = 0- w% S4 L5 a3 m T: C
输出:[-1,-1] 2 w E% G! u4 H2 M* N1# B" P% U( _7 h2 x/ X- b; F8 E
2 : r! x4 e0 J' c3( }' G, f& }7 e* {7 L! x
40 U; c; l/ W* n, |- a6 H
5- [. L9 x7 ~' U2 N' ]- @+ Y
6! H8 N- B& x5 p: U4 A, w
70 n. J' t7 w2 P9 r; Z6 M5 E' l
83 x' K" u# j z) _7 V
9 6 ^) T8 c4 B. F( l* K提示: 3 C* b2 v+ ~# B6 A8 r! `' k7 a6 v% y
0 <= nums.length <= 10(5) " }2 j1 J: E6 Q, q7 x-10(9) <= nums[i] <= 10(9)' n1 Z2 ~6 I( U/ h
nums 是一个非递减数组' ?3 k- _, V0 y- p- J
-10(9) <= target <= 10(9)) @* E4 Q# X( R8 S+ Q- ]' m
思路: G0 a& ~' D) j9 r
关键步骤,与二分查找不同 4 C0 e" F* g. _2 oif(target**<=**nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1); 6 ~+ |/ _. ^- e1 n/ }target==nums[mid]时,不结束循环,继续进入 % Y& W$ [ z) s两个if可以同时进入,寻找界限 ! X; s6 t3 p1 L. O! G6 g1 d. i设置限制,防止mid-1,mid+1越界9 L6 i& E1 h$ }) ^; {/ q
代码: |1 N( P! U* u3 C! T2 w
class Solution { 5 n9 V# F2 F( E V" ]8 ]& ^7 l7 Epublic:" S; p2 e5 H0 Y% d0 C7 n0 v
int left=-1,right=-1;; G" J! t. o6 s: U) O1 F9 E
vector<int> searchRange(vector<int>& nums, int target) { # i: R( r& M0 d2 p( U* q if(nums.size()==0) return vector<int>{-1,-1};1 \6 s* d/ ^1 x# o' I9 e
binary_search(nums,target,0,nums.size());; K9 x4 [& Q% \: d5 M
return vector<int>{left,right}; 0 n! e. f; t& Q! O* ^) ^2 [5 l' y } # U" r7 ]1 i3 t2 n void binary_search(vector<int>& nums,int target,int l ,int r){ 1 ]6 r$ |2 e# A. h; b' T* N: j int mid=(r-l)/2+l; ! p5 R* A4 H- g3 m2 i+ f* h //printf("%d-%d\n",l,r);; `9 B, e# @) ~" ]8 j) }" O( \
if(target==nums[mid]){0 X/ j8 A e! k/ g. A) i& i( H
if(left>mid||left<0) left=mid;+ F5 }( Y: i+ x, g
if(right<mid||right<0) right=mid;% \( g3 G' d1 |, K. {0 k0 a
} 2 s! E- `7 k. [/ ?" C if(l>=r) return; 4 Q2 u M* c0 A& {1 j4 O if(target<=nums[mid]&&mid-1>=0) binary_search(nums,target,l,mid-1);$ O) `. d/ w) B# J. X: V
if(target>=nums[mid]&&mid+1<nums.size()) binary_search(nums,target,mid+1,r); 2 `& F2 o( n' o# y% S9 J }! o. f4 B a! ?& z
};+ _4 J3 i2 r- x
7 w5 h4 N5 O2 C# \( Z1 k————————————————1 E. l5 b. w1 [! O: o7 a( s! D
版权声明:本文为CSDN博主「嗝~~~~」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 % u6 |/ k2 K, m原文链接:https://blog.csdn.net/qq_41735944/article/details/1266488321 e. [1 ]9 Y) g4 B/ {
( a. M" w4 `+ a( n' j- e
$ g V5 b0 M4 X" X8 ~* c