java算法——二分法

二分查找函数:

public static void midsearch(int k) {
    
    
		int l=0,h=m-1;
		while(l<h) {
    
    
			int mid = (l+h)/2;
		if(a[mid]==k) {
    
    
			flag=true;
			System.out.println(mid);
			return;
		}
		else if(a[mid]>k) {
    
    
			h = mid-1;}
		else l=mid+1;
		
		}
		if(flag==false) {
    
    
			System.out.println("数组中没有这个数");
		}
	}

二分查找一个大于等于X的最小值

	public static int FindH(int k) {
    
        //二分查找一个大于等于k的最小值
		int l=0,h=m-1;
		while(l<h) {
    
    
			int mid = (1+l+h)/2;   //如果找的数位于第二位时,会造成死循环,因此需要1+l+h
			if(a[mid]>k) {
    
    
				h = mid-1;
			}
			else l = mid;
		}
		return l;
	}

二分查找一个小于等于X的最小值

	public static int FindL(int k) {
    
      //二分查找一个小于等于k的最小值
		int l=0,h=m-1;
		
		while(l<h) {
    
    
			int mid = (l+h)/2;
			if(a[mid]<k) {
    
    
				l=mid+1;
			}
			else h=mid;
		}
		return l;
	}
	

例题:

在这里插入图片描述

源代码:

package Three;

import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.Scanner;
	
	public static int FindL(int k) {
    
      //二分查找一个小于等于k的最小值
		int l=0,h=m-1;
		
		while(l<h) {
    
    
			int mid = (l+h)/2;
			if(a[mid]<k) {
    
    
				l=mid+1;
			}
			else h=mid;
		}
		return l;
	}
	
	public static int FindH(int k) {
    
        //二分查找一个大于等于k的最小值
		int l=0,h=m-1;
		while(l<h) {
    
    
			int mid = (1+l+h)/2;   //如果找的数位于第二位时,会造成死循环,因此需要1+l+h
			if(a[mid]>k) {
    
    
				h = mid-1;
			}
			else l = mid;
		}
		return l;
	}
	
	public static void main(String[] args) {
    
    
		Scanner in = new Scanner(System.in);
		 m = in.nextInt();
		int n = in.nextInt();
        for(int i=0;i<m;i++)
        	a[i] = in.nextInt();
        for(int j=0;j<n;j++)
        	b[j]=in.nextInt();
        for(int z=0;z<n;z++) {
    
    
        	int l = FindL(b[z]);
        	int h = FindH(b[z]);
        	if(a[l]==b[z]) System.out.println(l+" "+h);
        	else System.out.println("-1 -1");
        }
     
	}
}

2020.11.10–22.16

猜你喜欢

转载自blog.csdn.net/weixin_44919936/article/details/109608624