|
|
|
@ -1,3 +1,5 @@
|
|
|
|
|
use std::cmp::Ordering;
|
|
|
|
|
|
|
|
|
|
fn findMin(nums: Vec<i32>) -> i32 {
|
|
|
|
|
let mut res = nums[0] as i32;
|
|
|
|
|
// The left and right pointers of the binary search
|
|
|
|
@ -5,24 +7,20 @@ fn findMin(nums: Vec<i32>) -> i32 {
|
|
|
|
|
|
|
|
|
|
// Binary search
|
|
|
|
|
while l <= r {
|
|
|
|
|
// If the left value is smaller than the right value,
|
|
|
|
|
// then the left value is the smallest
|
|
|
|
|
if nums[l] <= nums[r] {
|
|
|
|
|
res = res.min(nums[l]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
// The middle value
|
|
|
|
|
let mid = l + (r - l) / 2;
|
|
|
|
|
// Update the smallest value
|
|
|
|
|
res = res.min(nums[mid]);
|
|
|
|
|
|
|
|
|
|
// If the left value is smaller than the middle value,
|
|
|
|
|
// then the smallest value is on the right side
|
|
|
|
|
if nums[l] <= nums[mid] {
|
|
|
|
|
l = mid + 1;
|
|
|
|
|
} else {
|
|
|
|
|
// Otherwise, the smallest value is on the left side
|
|
|
|
|
r = mid - 1;
|
|
|
|
|
match nums[l].cmp(&nums[r]) {
|
|
|
|
|
Ordering::Less | Ordering::Equal => { // The array is sorted
|
|
|
|
|
res = res.min(nums[l]);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
Ordering::Greater => { // The array is rotated
|
|
|
|
|
let mid = l + (r - l) / 2; // The middle index
|
|
|
|
|
res = res.min(nums[mid]); // Update the minimum
|
|
|
|
|
if nums[l] <= nums[mid] { // The left half is sorted
|
|
|
|
|
l = mid + 1;
|
|
|
|
|
} else { // The right half is sorted
|
|
|
|
|
r = mid - 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return res as i32;
|
|
|
|
|