Binary Search 時間複雜度 O(logN ), 由於每次減小一半 至關於取logdom
Q: 何時能夠用Binary Seach?spa
A: 當數據是Sorted 而且支持Random Access的時候code
Binary Search 的基本規則blog
1. 搜索空間在循環中不斷減少element
The Searching Area decrease during the processget
2. 目標元素(若是存在)不能夠被排除到搜索空間以外 class
Basic Binary Search 搜索
public int binarySearch(int[] array, int target) { //Corner case if(array==null || array.length==0){ return -1; } int left=0; int right=array.length-1; while(left<=right){ int mid=left+(right-left)/2; if(array[mid]==target){ return mid; }else if(array[mid]>target){ right=mid-1; }else{ left=mid+1; } } return -1; }
注意幾點常見錯誤 循環
1. int mid=left+(right-left)/2;數據
目的是防止Overflow
2. 注意while 條件的判斷 , 如下循環條件排列從苛刻到寬鬆
(1).while(left<=right)
留下0個元素
(2).while(left<right)
留下1個元素
(3).while(left<right-1)
留下兩個元素
尋找最接近的元素index
public int closest(int[] array, int target) { //Corner case if(array==null || array.length==0){ return -1; } int left=0; int right=array.length-1; while(left<right-1){ int mid=left+(right-left)/2; if(array[mid]==target){ return mid; }else if(array[mid]>target){ //the right element may be the result //cannot be ruled out right=mid; }else{ //the left element may be the result //cannot be ruled out left=mid; } } //Post processing if(target-array[left]<array[right]-target){ return left; }else{ return right; } }