/**
* https://leetcode.cn/problems/search-in-rotated-sorted-array/description/
* 找到旋转的点
* 判断target的值是在旋转点的那一边
* 在在这个区间内使用二分查找
* */
public static void hanShu1(int[] nums, int target){
int left=0,right=nums.length-1;
while (left<right){
int mid=left+(right-left)/2;
if (nums[mid]<=nums[nums.length-1])right=mid;
else left=mid+1;
}
int l_left=0,r_right=0;
if (nums[nums.length-1]>=target){
l_left=left;r_right=nums.length-1;
}else {
l_left=0;r_right=left;
}
while (l_left<=r_right){
int m_mid=l_left+(r_right-l_left)/2;
if (nums[m_mid]>target)r_right=m_mid-1;
else if (nums[m_mid]<target)l_left=m_mid+1;
else System.out.println(m_mid);
}
}
/**
* https://leetcode.cn/problems/search-in-rotated-sorted-array/description/
* 找到旋转的点
* 判断target的值是在旋转点的那一边
* 在在这个区间内使用二分查找
* 由于会含有相同的数据,那就需要将两个区间都进行再一次的二分查找
* */
public static void hanShu2(int[] nums, int target){
int left=0,right=nums.length-1;
while (left<right){
int mid=left+(right-left)/2;
if(nums[left]==nums[mid]){
left++;
continue;
}
if (nums[mid]<=nums[nums.length-1])right=mid;
else left=mid+1;
}
int l_left=0,r_right=nums.length-1;
if (nums[nums.length-1]>target){
l_left=left;r_right=nums.length-1;
}else if (nums[nums.length-1]<target){
l_left=0;r_right=left;
}else if (nums[nums.length-1]==target){
System.out.println("ok");
return;
}
while (l_left<=r_right){
int m_mid=l_left+(r_right-l_left)/2;
if (nums[m_mid]>target)r_right=m_mid-1;
else if (nums[m_mid]<target)l_left=m_mid+1;
else{ System.out.println(m_mid);return;}
}
}