20250201 finished.
This commit is contained in:
parent
e64dee58aa
commit
cdbf7d074f
|
@ -462,3 +462,5 @@ mod p119_pascals_triangle_ii;
|
||||||
mod p350_intersection_of_two_arrays_ii;
|
mod p350_intersection_of_two_arrays_ii;
|
||||||
|
|
||||||
mod p541_reverse_string_ii;
|
mod p541_reverse_string_ii;
|
||||||
|
|
||||||
|
mod p81_search_in_rotated_sorted_array_ii;
|
||||||
|
|
90
src/problem/p81_search_in_rotated_sorted_array_ii.rs
Normal file
90
src/problem/p81_search_in_rotated_sorted_array_ii.rs
Normal file
|
@ -0,0 +1,90 @@
|
||||||
|
/**
|
||||||
|
* [81] Search in Rotated Sorted Array II
|
||||||
|
*/
|
||||||
|
pub struct Solution {}
|
||||||
|
|
||||||
|
// submission codes start here
|
||||||
|
|
||||||
|
impl Solution {
|
||||||
|
pub fn search(nums: Vec<i32>, target: i32) -> bool {
|
||||||
|
if nums.len() == 1 {
|
||||||
|
return target == nums[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
let (mut left, mut right) = (0, nums.len());
|
||||||
|
|
||||||
|
// 搜索范围[left, right)
|
||||||
|
while left < right {
|
||||||
|
let middle = (right - left) / 2 + left;
|
||||||
|
|
||||||
|
if nums[middle] == target {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if nums[middle] > nums[0] {
|
||||||
|
// 左侧的数组是有序的
|
||||||
|
if target >= nums[0] && target < nums[middle] {
|
||||||
|
right = Self::get_first_middle(&nums, middle);
|
||||||
|
} else {
|
||||||
|
left = Self::get_last_middle(&nums, middle) + 1;
|
||||||
|
}
|
||||||
|
} else if nums[middle] == nums[0] {
|
||||||
|
// 有可能nums[middle] == nums[0]
|
||||||
|
let first_middle = Self::get_first_middle(&nums, middle);
|
||||||
|
if first_middle == 0 {
|
||||||
|
// [0, middle] 都是同一个数
|
||||||
|
left = Self::get_last_middle(&nums, middle) + 1;
|
||||||
|
} else {
|
||||||
|
// 反之那么[middle,]都是同一个数
|
||||||
|
right = first_middle;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// 右侧数组是有序的
|
||||||
|
if target > nums[middle] && target <= nums[nums.len() - 1] {
|
||||||
|
left = Self::get_last_middle(&nums, middle) + 1;
|
||||||
|
} else {
|
||||||
|
right = Self::get_first_middle(&nums, middle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_first_middle(nums: &Vec<i32>, mut middle: usize) -> usize {
|
||||||
|
while middle > 0 && nums[middle - 1] == nums[middle] {
|
||||||
|
middle -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
middle
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_last_middle(nums: &Vec<i32>, mut middle: usize) -> usize {
|
||||||
|
while middle < nums.len() - 1 && nums[middle + 1] == nums[middle] {
|
||||||
|
middle += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
middle
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// submission codes end
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_81() {
|
||||||
|
assert!(Solution::search(
|
||||||
|
vec![1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1],
|
||||||
|
2
|
||||||
|
));
|
||||||
|
assert!(Solution::search(
|
||||||
|
vec![1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1],
|
||||||
|
2
|
||||||
|
));
|
||||||
|
assert!(Solution::search(vec![2, 5, 6, 0, 0, 1, 2], 0));
|
||||||
|
assert!(!Solution::search(vec![2, 5, 6, 0, 0, 1, 2], 3));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user