AcWing打卡活动
《剑指Offer》打卡活动
周一第十题 旋转数组的最小数字
/**
* 利用旋转数组的特点,左边数组要比右边数组打,结合二分法即可即可解出
**/
class Solution {
public int findMin(int[] nums) {
if(nums.length <= 0) { // 参数校验
return -1;
}
// 先不考虑数组中有重复的数字,可使用二分法的思路
int pointOne = 0; // 第一个指针指向数组的第一个元素
int pointTwo = nums.length - 1; // 第二个指针指向数组中第二个元素
int mid = pointOne;// 指向两个指针的中心
while(nums[pointOne] >= nums[pointTwo]) {
mid = pointOne + pointTwo >> 1;
if(pointTwo - pointOne == 1) {
return nums[pointTwo];
}
// 考虑数组中存在重复的项,则遍历整个数组找出最小数
if(nums[pointOne] == nums[pointTwo] &&
nums[pointOne] == nums[mid]) {
return minInOrder(nums, pointOne, pointTwo);
}
// 二分法基本操作
if(nums[mid] >= nums[pointOne]) { // 需要考虑等于的可能性
pointOne = mid;
} else if(nums[mid] <= nums[pointTwo]) { // 需要考虑等于的可能性
pointTwo = mid;
}
}
// 如果该数组是把前面0个元素放到最后,则直接输出第一个元素
return nums[mid];
}
// 如果数组中存在重复的项,则只有通过遍历找出最小的数字
public int minInOrder(int[] nums, int pointOne, int pointTwo){
int result = nums[pointOne];
for(int i = pointOne + 1; i <= pointTwo - 1; i ++) {
if(result > nums[i]) {
result = i;
}
}
return nums[result];
}
}