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

 

posted @ 2023-11-09 08:51  超爱彬宝同学  阅读(8)  评论(0)    收藏  举报