/**
* https://leetcode.cn/problems/find-peak-element/description/
* 由于数组的两个端点前后都是负无穷,所以给定一个i如果arr[i]>arr[i+1]说明在[0,i]这个区间里面一定有个峰值
* 反之则在[i,n]之间
* 以此使用二分查找算法
* 当满足第一个条件的时候left=mid
* 反之right=mid-1
* */
public static void hanShu22(int[] nums){
int left=0,right=nums.length-1;
while (left<right){
int mid=left+(right-left)/2;
if (nums[mid]>nums[mid+1])right=mid;
else left=mid+1;
}
System.out.println(left);
}
/**
* https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/
* 题目意思为将最后的一个数据移到前面来,然后给你一个旋转后的数组判断最小值
* 数组大小为n
* 旋转后的数组被分为两个区域,一个区域为arr[i]>arr[n-1]
* 另外一个为arr[i]<=arr[n-1]
* 当落在第一个区域时left=mid+1;
* 反之right=mid;
* */
public static void hanShu23(int[] nums){
int left=0,right=nums.length-1;
while (left<right){
int mid=left+(right-left)/2;
if (nums[mid]>nums[nums.length-1])left=mid+1;
else right=mid;
}
System.out.println(nums[left]);
}
/**
* https://leetcode.cn/problems/que-shi-de-shu-zi-lcof/description/
* 使用二分算法,当缺失数组后,下标和值就不对应起来了
* 当下标和值相等时 left=mid+1;
* 不等时 right=mid;
* */
public static void hanShu24(int[] nums){
int left=0,right=nums.length-1;
while (left<right){
int mid=left+(right-left)/2;
if (nums[mid]==mid)left=mid+1;
else right=mid;
}
System.out.println(left);
}