思路:使用左右两个指针,左指针最初指向0,右指针指向最后一个元素。根据左右指针所指的数据和中间指针所指数据的大小关系移动指针。
(注意:如果左右指针只相差1,需要特殊处理)
Java代码如下:
public class Solution {
// 在left~right 之间顺序查找最小元素
public static int findMinNum(int[] nums, int left, int right) {
int min = nums[left];
for (int i = left + 1; i <= right; i++) {
if (nums[i] < min) {
min = nums[i];
}
}
return min;
}
// 寻找旋转数组中的最小数
public static int findMin(int[] nums) {
if (nums == null || nums.length == 0) {
return -1;
}
int left = 0;
int right = nums.length - 1;
int middle = 0;
while (nums[left] >= nums[right]) {
if ((right - left) == 1) {
middle = right;
break;
}
middle = (left + right) / 2;
if ((nums[left] == nums[right]) && (nums[right] == nums[left])) {
// 在left~right 之间顺序查找最小元素
return findMinNum(nums, left, right);
}
if (nums[middle] < nums[left]) {
right = middle;
} else {
left = middle;
}
}
return nums[middle];
}
public static void main(String[] args) {
int[] nums = { 4,5,6, 1,2,3,};
System.out.println(findMin(nums));
}
}