Merge pull request #362 from caitlingao/16_binary_search
feat(geektime_algo): add 16 binary search
This commit is contained in:
commit
a10a462d3f
93
rust/16_binary_search/binary_search.rs
Normal file
93
rust/16_binary_search/binary_search.rs
Normal file
@ -0,0 +1,93 @@
|
||||
// 查找第一个给定值的元素
|
||||
fn find_first_eq(nums: Vec<i32>, value: i32) -> i32 {
|
||||
if nums.is_empty() { return -1; }
|
||||
|
||||
let mut start = 0;
|
||||
let mut end = nums.len() - 1;
|
||||
|
||||
while start <= end {
|
||||
let mid = start + ((end - start) >> 1);
|
||||
if nums[mid] <= value {
|
||||
if mid == 0 || (nums[mid] == value && nums[mid-1] != value) { return mid as i32; }
|
||||
start = mid + 1;
|
||||
} else {
|
||||
end = mid - 1;
|
||||
}
|
||||
}
|
||||
-1
|
||||
}
|
||||
|
||||
// 查找最后一个给定值的元素
|
||||
fn find_last_eq(nums: Vec<i32>, value: i32) -> i32 {
|
||||
if nums.is_empty() { return -1; }
|
||||
|
||||
let mut start = 0;
|
||||
let mut end = nums.len() - 1;
|
||||
|
||||
while start <= end {
|
||||
let mid = start + ((end - start) >> 1);
|
||||
if nums[mid] <= value {
|
||||
if mid == end || (nums[mid] == value && nums[mid+1] != value) { return mid as i32; }
|
||||
start = mid + 1;
|
||||
} else {
|
||||
end = mid - 1;
|
||||
}
|
||||
}
|
||||
-1
|
||||
}
|
||||
|
||||
// 查找第一个大于等于给定值的元素
|
||||
fn find_first_ge(nums: Vec<i32>, value: i32) -> i32 {
|
||||
if nums.is_empty() { return -1; }
|
||||
|
||||
let mut start = 0;
|
||||
let mut end = nums.len() - 1;
|
||||
|
||||
while start <= end {
|
||||
let mid = start + ((end - start) >> 1);
|
||||
if nums[mid] < value {
|
||||
start = mid + 1;
|
||||
} else {
|
||||
if mid == end || (nums[mid] >= value && nums[mid-1] < value) { return mid as i32; }
|
||||
end = mid - 1;
|
||||
}
|
||||
}
|
||||
-1
|
||||
}
|
||||
|
||||
// 查找最后一个小于等于给定值的元素
|
||||
fn find_last_le(nums: Vec<i32>, value: i32) -> i32 {
|
||||
if nums.is_empty() { return -1; }
|
||||
|
||||
let mut start = 0;
|
||||
let mut end = nums.len() - 1;
|
||||
|
||||
while start <= end {
|
||||
let mid = start + ((end - start) >> 1);
|
||||
if nums[mid] <= value {
|
||||
if mid == 0 || (nums[mid] <= value && nums[mid+1] > value) { return mid as i32; }
|
||||
start = mid + 1;
|
||||
} else {
|
||||
end = mid - 1;
|
||||
}
|
||||
}
|
||||
-1
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let nums1 = vec![1, 3, 5, 6, 8, 8, 8, 11, 18];
|
||||
let first_eq = find_first_eq(nums1, 8);
|
||||
println!("{:?}", first_eq);
|
||||
|
||||
let nums2 = vec![1, 3, 5, 6, 8, 8, 8, 11, 18];
|
||||
let last_eq = find_last_eq(nums2, 8);
|
||||
println!("{:?}", last_eq);
|
||||
|
||||
let nums3 = vec![1, 3, 5, 6, 8, 8, 8, 11, 18];
|
||||
let find_first_ge = find_first_ge(nums3, 5);
|
||||
println!("{:?}", find_first_ge);
|
||||
|
||||
let nums4 = vec![1, 3, 5, 6, 8, 8, 8, 11, 18];
|
||||
let find_last_le = find_last_le(nums4, 17);
|
||||
println!("{:?}", find_last_le);
|
||||
}
|
35
rust/16_binary_search/search_in_rotated_sorted_array.rs
Normal file
35
rust/16_binary_search/search_in_rotated_sorted_array.rs
Normal file
@ -0,0 +1,35 @@
|
||||
// leetcode 33 Search in Rotated Sorted Array (https://leetcode.com/problems/search-in-rotated-sorted-array/)
|
||||
pub fn search(nums: Vec<i32>, target: i32) -> i32 {
|
||||
if nums.is_empty() { return -1; }
|
||||
|
||||
let mut low = 0;
|
||||
let mut high = nums.len() - 1;
|
||||
|
||||
while low <= high {
|
||||
let mid = low + ((high - low) >> 1);
|
||||
if nums[mid] == target { return mid as i32; }
|
||||
|
||||
// left is order
|
||||
if nums[low] <= nums[mid] {
|
||||
// target is in left array
|
||||
if nums[low] <= target && target <= nums[mid] {
|
||||
high = mid - 1;
|
||||
} else {
|
||||
low = mid + 1;
|
||||
}
|
||||
} else {
|
||||
if nums[mid] <= target && target <= nums[high] {
|
||||
low = mid + 1;
|
||||
} else {
|
||||
high = mid - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
-1
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let nums = vec![4,5,6,7,0,1,2];
|
||||
let n = search(nums, 0);
|
||||
println!("{:?}", n);
|
||||
}
|
Loading…
Reference in New Issue
Block a user