二分法最早联想到为在有序数组中寻找想要的某个数。
但前提的数组一定要为有序,这样才能排除一半。巧妙地运用的问题的特殊性,和条件的特殊性。
此问题若要使用暴力的做法为遍历整个数组来寻找,时间复杂度为O(n)的。
但使用二分法后其时间复杂度就优化到了O(log2(n)),速度被大大的优化了。
但不一定是要有序才可以使用二分法,这是很多人的误区。如上所说,一些问题只要抓住了问题的特殊性和条件的特殊性就可以使用二分法。如寻找数组中的局部最小值(相邻的数大小不一)。
何为局部最小值。int arr[N]。
特别地if arr[0]<arr[1],可以称arr[0]为局部最小值。同理,if arr[n-1]<arr[n-2],可以称arr[n-1]为局部最小值。
一般地,arr[i]<arr[i+1] and arr[i]<arr[i-1]。则arr[i]就为局部最小值。局部最小值相当于一个数组中谷底的位置。可以想象数组为一条折线,但mid值不满足成为局部最小值条件的时候就可以减半范围。
如if arr[mid]>arr[mid-1] 或 arr[mid]>arr[mid+1]