二分法问题

Posted yangbocsu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分法问题相关的知识,希望对你有一定的参考价值。

二分法问题




来源

一、有序数组中找到num

	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) 
				L = mid + 1;
			 else 
				R = mid - 1;
			
		
		return false;
	

二、有序数组中找到> =num最左的位置

	// arr有序的,>=num 最左
	public static int mostLeftNoLessNumIndex(int[] arr, int num) 
		if (arr == null || arr.length == 0) 
			return -1;
		
		int L = 0;
		int R = arr.length - 1;
		int ans = -1;
		while (L <= R) 
			int mid = (L + R) / 2;
			if (arr[mid] >= num) //砍掉右边
				ans = mid;
				R = mid - 1;
			 else // 砍掉左边
				L = mid + 1;
			
		
		return ans;
	

三、有序数组中找到<=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;
	

四、局部最小值问题

	// arr 相邻的数不相等!
	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;
		
		int L = 0;
		int R = N - 1;
		// L...R 肯定有局部最小
		while (L < R - 1) 
			int mid = (L + R) / 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;
	

以上是关于二分法问题的主要内容,如果未能解决你的问题,请参考以下文章

解决为啥svn没有对号等符号的问题

有个符号 是一个方块 里面是个对号 怎么打出来的?

Java编程最容易忘记的问题,请对号入座!

Java编程最容易忘记的问题,请对号入座!

word里面怎么在口里打对号啊?

对号入座排序法