Skip to content

Commit 2a9d0c5

Browse files
committed
q34
1 parent d874394 commit 2a9d0c5

File tree

5 files changed

+177
-1
lines changed

5 files changed

+177
-1
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
.idea
2-
target
2+
target
3+
venv

Cargo.lock

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,4 @@ edition = "2018"
77
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
88

99
[dependencies]
10+
array = {path="./array"}

array/src/q34.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import pytest
2+
from typing import List
3+
4+
5+
def search_range(nums: List[int], target: int) -> List[int]:
6+
if len(nums) == 0:
7+
return [-1, -1]
8+
9+
if len(nums) == 1:
10+
if nums[0] == target:
11+
return [0, 0]
12+
else:
13+
return [-1, -1]
14+
15+
16+
left, right, pos = 0, len(nums) - 1, len(nums)
17+
18+
while left <= right:
19+
mid = int((left + right) / 2 )
20+
21+
if nums[mid] > target:
22+
right = mid - 1
23+
elif nums[mid] < target:
24+
left = mid + 1
25+
else:
26+
pos = mid
27+
break
28+
29+
30+
if pos > len(nums) - 1 or nums[pos] != target:
31+
return [-1, -1]
32+
33+
34+
start, end = pos, pos
35+
36+
while start > 0 and nums[start] == target:
37+
start -= 1
38+
39+
if nums[0] == target:
40+
start = 0
41+
else:
42+
start += 1
43+
44+
while end < len(nums) and nums[end] == target:
45+
end += 1
46+
47+
if nums[-1] == target:
48+
end = len(nums) - 1
49+
else:
50+
end -= 1
51+
52+
return [start, end]
53+
54+
55+
def test_1():
56+
assert search_range([5, 7, 7, 8, 8, 10], 8) == [3,4]
57+
assert search_range([5, 7, 7, 8, 8, 10], 6) == [-1, -1]
58+
assert search_range([2, 2], 1) == [-1, -1]
59+
assert search_range([1, 2, 3], 1) == [0, 0]
60+
assert search_range([1, 4], 4) == [1, 1]
61+
62+
63+
if __name__ == '__main__':
64+
pytest.main(["./q34.py", "-v", "-s"])

array/src/q34.rs

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
use std::io::{self, Write};
2+
3+
struct Solution ();
4+
impl Solution {
5+
6+
pub fn helper(nums: &Vec<i32>, target: i32) -> usize {
7+
8+
if nums[0] == target {
9+
return 0
10+
}
11+
12+
let mut l = 0;
13+
let mut r = nums.len() - 1;
14+
let mut a = nums.len();
15+
16+
while l <= r && r != 0 {
17+
let m = (l + r) / 2;
18+
println!("{} {} {}", l, m ,r);
19+
if nums[m] > target {
20+
r = if m >= 1 { m - 1 } else { 0 };
21+
} else if nums[m] < target {
22+
l = m + 1;
23+
} else {
24+
a = m;
25+
break
26+
}
27+
}
28+
29+
if r == 0 && nums.last().unwrap() == &target {
30+
nums.len() - 1
31+
} else {
32+
a
33+
}
34+
}
35+
36+
pub fn search_range(nums: Vec<i32>, target: i32) -> Vec<i32> {
37+
match nums.len() {
38+
0 => vec![-1, -1],
39+
1 if nums[0] == target => vec![0, 0],
40+
1 => vec![-1, -1],
41+
_ => {
42+
let hit = Solution::helper(&nums, target);
43+
println!("{}", hit);
44+
if hit < nums.len() && nums[hit] == target {
45+
let mut s = hit;
46+
let mut e = hit;
47+
48+
while s >0 && nums[s] == target {
49+
s = s - 1
50+
}
51+
if nums[0] == target {
52+
s = 0
53+
} else {
54+
s = s + 1
55+
}
56+
57+
while e < nums.len() && nums[e] == target {
58+
e = e + 1
59+
}
60+
if nums.last().unwrap() == &target {
61+
e = nums.len() - 1
62+
} else {
63+
e = e - 1
64+
}
65+
66+
vec![s as i32, e as i32]
67+
} else {
68+
vec![-1, -1]
69+
}
70+
}
71+
}
72+
73+
}
74+
}
75+
76+
77+
#[cfg(test)]
78+
mod tests {
79+
use super::*;
80+
81+
#[test] fn test_1() {
82+
println!("hello");
83+
// assert_eq!(Solution::search_range(
84+
// vec![5,7,7,8,8,10], 8
85+
// ), vec![3, 4]);
86+
// assert_eq!(Solution::search_range(
87+
// vec![5,7,7,8,8,10], 6
88+
// ), vec![-1, -1]);
89+
// assert_eq!(Solution::search_range(
90+
// vec![2, 2], 1
91+
// ), vec![-1, -1]);
92+
//
93+
// assert_eq!(Solution::search_range(
94+
// vec![1,2,3], 1
95+
// ), vec![0, 0]);
96+
97+
assert_eq!(Solution::search_range(
98+
vec![1,4], 4
99+
), vec![1, 1])
100+
}
101+
}

0 commit comments

Comments
 (0)