芝士算法(二分查找法2.0)

目录

山脉数组的峰顶索引

寻找峰值

点名

寻找旋转数组中的最小值

​编辑


山脉数组的峰顶索引

山脉数组的峰顶索引

java 复制代码
 public int peakIndexInMountainArray(int[] arr) {
        int left = 0;
        int right = arr.length - 1 ;
        while(left < right){
            int mid = left + (right - left )/2;
            if(arr[mid] < arr[mid + 1])
            left = mid + 1;
            else if(arr[mid] > arr[mid + 1])
            right = mid ;
            // else
            // return mid;
        }
        return left;

    }

寻找峰值

寻找峰值

java 复制代码
public int findPeakElement(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while(left < right){
            int mid  = left + (right - left + 1) / 2;
            if(nums[mid] > nums[mid - 1])
             left = mid ;
            else
            right = mid  - 1;
        }
        return left;
    }

点名

点名

java 复制代码
 public int takeAttendance(int[] records) {
        int left = 0;
        int right = records.length - 1;
        while(left < right){
            int mid = left + (right - left) / 2;
            if(records[mid] == mid)
            left = mid  + 1;
            else
            right = mid;
        }
        // return records[left] == left ? left + 1 : left;
        if(records[left] == left)
        return left + 1;
        return left;
    }

寻找旋转数组中的最小值

寻找旋转数组中的最小值

java 复制代码
 public int findMin(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        int x = nums[right];
        while(left < right){
            int mid = left + (right - left) / 2;
            if(nums[mid] > x)
            left =  mid + 1;
            else
            right = mid;
        }
        return nums[left];
    }