二分法
维持一个查询区间,并不断地按照某种标准对区间进行删减(二分),过程中保证最小值始终处于区间内。当区间缩小到只有两个值时,进行一次比较就可以获得答案。
起始区间即为输入区间,两个端点分别是 start(index = 0) 和 end(index = nums.length - 1)。当前所发现的最小值即为数组的最后一个值。取区间中间值 mid(index = start + (end - start) / 2),比较该值是否小于目前所发现的最小值。
如果小于,说明全数组最小值位于 start 和 mid 之间(包含start和mid),更新目前所发现的最小值
如果大于,说明全数组最小值位于 mid 和 end 之间(包含mid和end)
你可以想一下如果小于起始数会怎么样
你怎么移动
题目
Suppose a sorted array 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.
Notice
You may assume no duplicate exists in the array.
Example
Given [4, 5, 6, 7, 0, 1, 2] return 0
OOXX二分法(find the first X)。特征:相对最后一个数的大小。O:>nums[end]; X: <=nums[end]。
切记要和最后一个数比,不可以和第一个数比,因为和第一个数比在没有rotate过的特殊情况里会找空。
强调一下,因为基础不牢固 int 不是int[] 返回的是一个数值
start 和end是新定义的 所以不用声明起始
public class Solution {
/*
* @param nums: a rotated sorted array
* @return: the minimum number in the array
*/
public int findMin(int[] nums) {
// write your code here
int start = 0;
int end = nums.length - 1;
int cmpTarget = nums[end];
while (start + 1 < end){
int mid = start + (end - start) / 2;
if (nums[mid] > cmpTarget){
start = mid;
} else {
end = mid;
}
}
return Math.min(nums[start], nums[end]);
}
}
lintcode160- Find Minimum in Rotated Sorted Array II- medium
就是最后一点 认为有重复值怎么办
Suppose a sorted array 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.
Notice
The array may contain duplicates.
Example
Given [4,4,5,6,7,0,1,2] return 0.
public class Solution {
/*
* @param nums: a rotated sorted array
* @return: the minimum number in the array
*/
public int findMin(int[] nums) {
//返回int这里怎么处理?
if (nums == null || nums.length == 0){
throw new IllegalArgumentException();
}
int start = 0;
int end = nums.length - 1;
while (end > 0 && nums[end] == nums[start]){
end--;
}
int cmpTarget = nums[end];
while (start + 1 < end){
int mid = start + (end - start) / 2;
if (nums[mid] > cmpTarget){
start = mid;
} else {
end = mid;
}
}
return Math.min(nums[start], nums[end]);
}
}