1pub struct Solution;
49impl Solution {
50
51 pub fn search_range(nums: Vec<i32>, target: i32) -> Vec<i32> {
53 match (binary_search_low(&nums[..], target), binary_search_high(&nums[..], target)) {
54 (Some(lower), Some(upper)) => vec![lower as i32, upper as i32],
55 _ => vec![-1, -1],
56 }
57 }
58}
59
60fn binary_search_low(nums: &[i32], target: i32) -> Option<usize> {
62 let mut len = nums.len();
63 if len == 0 {
64 return None;
65 } else if len == 1 && nums[0] == target {
66 return Some(0);
67 }
68 let mut base = 0;
69 let mut res = None;
70
71 while len > 1 {
72 let half = len / 2;
73 let mid = base + half;
74 if len == 2 {
75 if nums[base] == target {
76 return Some(base);
77 } else if nums[mid] == target {
78 return Some(mid);
79 }
80 }
81 base = if nums[mid] >= target {
82 res = Some(mid);
83 base
84 } else {
85 mid
86 };
87 len -= half;
88 }
89 res.and_then(|r| {
90 if nums[r] == target {
91 Some(r)
92 } else {
93 None
94 }
95 })
96}
97
98fn binary_search_high(nums: &[i32], target: i32) -> Option<usize> {
99 let mut len = nums.len();
100 if len == 0 {
101 return None;
102 } else if len == 1 && nums[0] == target {
103 return Some(0);
104 }
105
106 let mut base = 0;
107 let mut res = None;
108
109 while len > 1 {
110 let half = len / 2;
111 let mid = base + half;
112
113 if len == 2 {
114 if nums[mid] == target {
115 return Some(mid);
116 } else if nums[base] == target {
117 return Some(base);
118 }
119 }
120
121 base = if nums[mid] > target {
122 res = Some(base);
123 base
124 } else {
125 mid
126 };
127 len -= half;
128 }
129 res.and_then(|r| {
130 if nums[r] == target {
131 Some(r)
132 } else {
133 None
134 }
135 })
136}
137
138#[cfg(test)]
139mod tests {
140 use super::*;
141
142 #[test]
143 fn test() {
144 let t = |n, t| Solution::search_range(n, t);
145 assert_eq!(vec![3i32, 4], t(vec![5,7,7,8,8,10], 8));
146 assert_eq!(vec![-1i32, -1], t(vec![5,7,7,8,8,10], 6));
147 }
148}