二分搜索及一些应用
二分搜索
对于在有序数组上的查找,我们可以使用二分搜索,时间复杂度为logn。
int BinarySearch(int* arr, int length, int num)
{int left, right, mid;left = 0;right = length - 1;mid = left + (right - left) >> 1;while (left <= right){if (arr[mid] == num)return mid;else if (arr[mid] <= num){left = mid + 1;mid = left + (right - left) >> 1;}else{right = mid - 1;mid = left + (right - left) >> 1;}}return -1;
}
寻找大于等于n的第一个数
//在有序数组中寻找>=num的最左位置
int BiggerLeft(int* arr, int length, int num)
{int mid, left, right;left = 0;right = length - 1;mid = (left + length) / 2;int result = -1;while (left <= right){if (arr[mid] >= num){result = mid;right = mid - 1;mid = left + (right - left) >> 1; //避免right + left时的溢出问题}else{left = mid + 1;mid = (left + right) / 2;}}return result;
}
寻找小于等于n的最后一个数
//寻找<=num的最右位置
int SmallerRight(int* arr, int length, int num)
{int left, right, mid, ans;left = 0;right = 0;mid = left + (right - left) >> 1;ans = -1;while (left <= right){if (arr[mid] == num)ans = mid;else if (arr[mid] <= num){left = mid + 1;mid = left + (right - left) >> 1;ans = mid;}else{right = mid - 1;mid = left + (right - left) >> 1;}}return ans;
}
峰值问题
请参考这篇博客:![https://blog.csdn.net/Oorchi/article/details/153657027]