二分查找算法题3
/** * 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;} } }