编程之美:二分查找_ios

前三个问题不讲,已经解决过了

现在写最后两个

1.最大的i使得arr[i]小于v,其实就是求等于v的下界的前一个元素。
2.最小的i使得arr[i]大于v,其实就是求等于v的上界的后一个元素。

#include <iostream>
#include<vector>
using namespace std;

int indexOfMaxLess(vector<int>& nums, int target){
int len = nums.size();
if (len == 0)
return -1;
int left = 0, right = len - 1;
while (left <= right){
int mid = left + (right - left) / 2;
if (target <= nums[mid])
right = mid - 1;
else
left = mid + 1;
}

if (left > 0){
return left - 1;
}

return -1;
}

int indexOfMinBigger(vector<int>& nums, int target){
int len = nums.size();
if (len == 0)
return -1;
int left = 0, right = len - 1;
while (left <= right){
int mid = left + (right - left) / 2;
if (target >= nums[mid])
left = mid + 1;
else
right = mid - 1;
}
if (right < len - 1){
return right + 1;
}
return -1;
}


int main()
{

vector<int> nums = { 0, 0, 2,2, 3, 3 };
cout << indexOfMaxLess(nums, 2) << endl;
cout << indexOfMinBigger(nums, 2) << endl;

cout << "-------------------" << endl;

cout << indexOfMaxLess(nums, 0) << endl;
cout << indexOfMinBigger(nums, 0) << endl;

cout << "-------------------" << endl;

cout << indexOfMaxLess(nums, 3) << endl;
cout << indexOfMinBigger(nums, 3) << endl;

return 0;
}

结果:

1
4
-------------------
-1
2
-------------------
3
-1