1.把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
思路:旋转数组有三种情况
1.array[mid]>array[high] 34512 则最小元素在mid右侧 left = mid +1;
2.array[mid]=array[high] 10111 11101 最小元素不好判断,要一个个查找可以用顺序查找也可以用 high = high -1;
3.array[mid]<array[high] 12345 34012右侧是递增的,最小元素就是该元素或者在mid的左侧 high= mid
public int minNumberInRotateArray(int [] array) {
int low = 0;
int high = array.length-1;
int middle = 0;
while(low<=high){
int mid = low+(high - low)/2;
if(array[mid]>array[high]) low = mid +1;
else if(array[mid] ==array[high]){
high = high - 1;
}else{
high = mid;
}
}
return array[low];
}
2.在旋转数组中查找某个值,找到返回该值在数组的索引,没有返回-1.
public static int search(int[] nums, int target) {
int start = 0;
int end = nums.length - 1;
while (start <= end){
int mid = (start + end) / 2;
if (nums[mid] == target)
return mid;
if (nums[start] <= nums[mid]){
if (target < nums[mid] && target >= nums[start])
end = mid - 1;
else
start = start + 1;
}
if (nums[mid] <= nums[end]){
if (target > nums[mid] && target <= nums[end])
start = mid + 1;
else
end = end - 1;
}
}
return -1;
}