题目描述
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
代码示例
public class Offer8 {
public static void main(String[] args) {
int[] nums = {3,4,5,1,2};
int[] nums2 = {1,1,1,1,0,1,1};
Offer8 testObj = new Offer8();
System.out.println(testObj.minNumInRotateArray(nums));
System.out.println(testObj.minNumInRotateArray(nums2));
System.out.println(testObj.minNumInRotateArray2(nums2));
}
//数组中没有重复数字的情况
public int minNumInRotateArray(int[] nums) {
if (nums.length == 0) {
return 0;
}
int low = 0;
int high = nums.length - 1;
while (low < high) {
int mid = low + (high - low) / 2;
if (nums[mid] <= nums[high]) {
high = mid;
} else {
low = mid + 1;
}
}
return nums[low];
}
//数组中有重复数字的情况
public int minNumInRotateArray2(int[] nums) {
if (nums.length == 0) {
return 0;
}
int low = 0;
int high = nums.length - 1;
while (low < high) {
int mid = low + (high - low) / 2;
if (nums[low] == nums[mid] && nums[mid] == nums[high]) {
return minNumber(nums, low, high);
} else if (nums[mid] <= nums[high]) {
high = mid;
} else {
low = mid + 1;
}
}
return nums[low];
}
private int minNumber(int[] nums, int low, int high) {
for (int i = low; i < high; i++) {
if (nums[i] > nums[i + 1]) {
return nums[i + 1];
}
}
return nums[low];
}
}