1. 程式人生 > 電腦技巧 >Excel 設定數值小數位數教學:四捨五入、無條件進位、捨去

Excel 設定數值小數位數教學:四捨五入、無條件進位、捨去

二分法

時間複雜度:logN

1)在一個有序陣列中,找某個數是否存在

package day1;

import java.util.Arrays;
/*
 * 二分查詢其中精確的一個數
 */
public class Code4_BSExist {
	public static boolean exist(int[] sortedArr,int num) {
		if(sortedArr == null || sortedArr.length == 0) return false;
		int L = 0;
		int R = sortedArr.length - 1;
		int mid = 0;
		
		while(L < R) {
			//mid = (L +R) / 2
			mid = L+((R-L) >> 1);  // mid = (L+R)/2
			if(sortedArr[mid] == num) {
				return true;
			} else if (sortedArr[mid] > num) {
				R = mid- 1;
			} else {
				L = mid + 1;
			}		
		}	
		return sortedArr[L] == num;		
	}
	
	public static int[] generateRandomArray(int maxSize,int maxValue) {
		
		//Math.random() [0,1)
		//Math.random() * N [0,N)
		//(int)(Math.random()*N) [0,N-1] 
		int[] arr = new int[(int)(Math.random()*(maxSize+1))];
		for(int i = 0 ; i < arr.length; i++) {
			//想做到負的到整的都有
			arr[i] = (int)((maxValue+1)*Math.random()) - (int)((maxValue+1)*Math.random());
		}
		return arr;
	}
	public static void main(String[] args) {
		int[] arr = generateRandomArray(100,100);
		int t = (int)((100+1)*Math.random()) - (int)((100+1)*Math.random());
		boolean res = exist(arr,t);
		System.out.println(Arrays.toString(arr));
		System.out.println(t);
		System.out.println(res);
	}		
}

2)在一個有序陣列中,找>=某個數最左側的位置

package day1;
//在arr上,找滿足>=value的最左位置
public class Code5_BSBearLeft {
	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;
				R = mid - 1;
			} else {
				L = mid +1;
			}		
		}
		return index;		
	}
		
}

3)在一個有序陣列中,找<=某個數最右側的位置

package day1;
////在arr上,找滿足<=value的最左位置
public class Code6_BSBearRight {
	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;
				R = mid - 1;
			} else {
				L = mid +1;
			}		
		}
		return index;		
	}
}

4)區域性最小值問題

0位置比1位置小

n位置比n-1位置小

n位置比n-1位置,n+1位置小

package day1;
//區域性最小值問題
public class Code7_BSAwesome {
	public static int getLessIndex(int[] arr) {
		if(arr == null || arr.length == 0) return -1;
		if(arr.length == 1 || arr[0] < arr[1]) return 0;
		if(arr[arr.length-1] < arr[arr.length -2]) return arr.length-1;
		
		int left = 1;
		int right = arr.length - 2;
		int mid = 0;
		while(left < right) {
			mid = (left +right) >> 1;
			if(arr[mid] > arr[mid-1]) {
				right = mid-1;
			} else if(arr[mid] > arr[mid+1]) {
				left = mid +1;
			} else 
				return mid;
		}
		return left;
	}
}