153. Find Minimum in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7]
might become [4,5,6,7,0,1,2]
).
Find the minimum element.
You may assume no duplicate exists in the array.
Example 1:
Input: [3,4,5,1,2]
Output: 1
Example 2:
Input: [4,5,6,7,0,1,2]
Output: 0
class Solution {
public:
int findMin(vector<int>& nums) {
int LeftIndex = 0;int RightIndex = nums.size() - 1;
while(LeftIndex < RightIndex){
int mid = (LeftIndex + RightIndex) / 2;
if(nums[mid] > nums[RightIndex]){
LeftIndex = mid +1;
}
else{
RightIndex = mid;
}
}
return nums[RightIndex];
}
};
二叉树模板:
/**查找第一个与key相等的元素的下标, 如果不存在返回-1 */
static int firstEqual(int[] arr,int key){
int L = 0, R = arr.length - 1; //在[L,R]查找第一个>=key的
int mid;
while( L <= R){
mid = L + (R - L)/2;
if(arr[mid] >= key)
R = mid - 1;
else
L = mid + 1;
}
if(L < arr.length && arr[L] == key)
return L;
return -1;
}
/**查找第一个大于等于key的元素的下标*/
static int firstLargeEqual(int[] arr,int key){
int L = 0, R = arr.length - 1;
int mid;
while( L <= R){
mid = L + (R - L) / 2;
if(arr[mid] >= key)
R = mid - 1;
else
L = mid + 1;
}
return L;
}
/**查找第一个大于key的元素的下标 */
static int firstLarge(int[] arr,int key){
int L = 0,R = arr.length - 1;
int mid;
while(L <= R){
mid = L + (R - L) / 2;
if(arr[mid] > key)
R = mid - 1;
else
L = mid + 1;
}
return L;
}
/**查找最后一个与key相等的元素的下标, 如果没有返回-1*/
static int lastEqual(int[] arr,int key){
int L = 0, R = arr.length - 1;
int mid;
while( L <= R){
mid = L + (R - L)/2;
if(arr[mid] <= key)
L = mid + 1;
else
R = mid - 1;
}
if(R >= 0 && arr[R] == key)
return R;
return -1;
}
/**查找最后一个小于等于key的元素的下标 */
static int lastSmallEqual(int[] arr,int key){
int L = 0, R = arr.length - 1;
int mid;
while( L <= R){
mid = L + (R - L) / 2;
if(arr[mid] <= key)
L = mid + 1;
else
R = mid - 1;
}
return R;
}
/**查找最后一个小于key的元素的下标*/
static int lastSmall(int[] arr,int key){
int L = 0, R = arr.length - 1;
int mid;
while(L <= R){
mid = L + (R - L) / 2;
if(arr[mid] < key)
L = mid + 1;
else
R = mid - 1;
}
return R;
}