Java-算法与数据结构刷题笔记-P3:二分法

1.有序数组中找到num

package LeetCode;

public class Code1_BSExit {
    public static void main(String[] args) {
        int [] arr={1,2,2,3,4,5,6,7,8};
        int num=5;
        boolean b = find(arr, num);
        System.out.println(b);
    }

    /**
     * 有序数组查找 数组 num
     * @param arr  :保证arr有序
     * @param num  : 查找的数字
     * @return
     */
    public static boolean find(int [] arr,int num){
        if (arr== null || arr.length==0){
            return false;
        }
        int L=0; //定义左边界
        int R=arr.length-1; //定义右边界
        while (L<=R){
            int mid = (L+R)/2; //中间位置
            if (arr[mid]==num){
                return true;
            }else if (arr[mid]>num){
                R=mid-1;
            }else {
                L=mid+1;
            }
        }
        return false;
    }
}

2.有序数组中找到>=num的最左位置

在这里插入图片描述

package LeetCode;

public class Code2_BSNearLeft {
    public static void main(String[] args) {
        int [] arr={1,2,2,3,4,5,6,7,8};
        int num=10;
        int i = mostLeftNoMoreNumIndex(arr, num);
        System.out.println(i);
    }

    /**
     * arr 有序的,找>=num 最左的位置
     * @param arr :有序数组
     * @param num :c
     * @return :>=num 最左的位置
     */
    public static int mostLeftNoMoreNumIndex(int []arr,int num){
        if(arr==null || arr.length==0){
            return -1;
        }
        int L=0;
        int R=arr.length-1;
        int index=-1;
        while (L<=R){
            int mid =(L+R);
            if (arr[mid]>=num){
                //index更新
                index=mid;
                R=mid-1;
            }else {
                //arr[mid]<num
                L=mid+1;

            }


        }
        return index;
    }
}

3.有序数组中找到<=num的最右位置

// 在arr上,找满足<=value的最右位置
	public static int nearestIndex(int[] arr, int value) {
		int L = 0;
		int R = arr.length - 1;
		int index = -1; // 记录最右的对号
		while (L <= R) {
			int mid = L + ((R - L) >> 1);
			if (arr[mid] <= value) {
				index = mid;
				L = mid + 1;
			} else {
				R = mid - 1;
			}
		}
		return index;
	}

4.局部最小值问题

  • 数组无序
  • 任意两个相邻位置数不相等
    在这里插入图片描述
/**
     * 寻找数组中 局部最小值
     * @param arr :整体无序,相邻两个数不相等
     * @return
     */
    public static int oneMinIndex(int [] arr){
        if (arr==null || arr.length==0){
            return -1;
        }
        int N=arr.length;
        if (N==1){
            return 0;
        }

        if (arr[0]<arr[1]){
            return 0;
        }

        if (arr[N-1]<arr[N-2]){
            return N-1;
        }

        // arr.length>2
        int L=0;
        int R=N-1;
        while (L<R-1){
            int mid =L+(R+L)/2;
            if (arr[mid]<arr[mid-1] && arr[mid]<arr[mid+1]){
                return mid;
            }else {
                if (arr[mid]>arr[mid-1]){
                    R=mid-1;
                }else {
                    L=mid+1;
                }

            }
        }
        return arr[L]<arr[R]?L:R;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值