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