二分查找知识链接:
知识点巩固
第一题:
/* C语言 */
/* 最基础,可以直接套用知识点里例举的例子写 */
int search(int* nums,int numsSize,int target){//nums是数组,numsSize是数组长度,target是目标值
int left=0, right=numsSize-1;
while(left<=right){//循环查找目标值
int mid=left+((right-left)>>1);//右移
if(nums[mid]==target){
return mid;
}else if(nums[mid]>target){
right=mid-1;
}else{
left=mid+1;
}
}
return -1;
}
第二题:
在一个严格递减的数组中,找到第二个比目标值target
大的数的下标。若不存在,则返回-1
。
/* C语言 */
/* 和上一题差不多,但在取列表时总-2的话,到最后会不存在,所以需要在判断一下;
因为是递减的数组,把判断之后的left,right交换一下就好了 */
int search(int* nums,int numsSize,int target){//nums是数组,numsSize是数组长度,target是目标值
int left=0, right=numsSize-1;
while(left<=right){//循环查找目标值
int mid=left+((right-left)>>1);//右移
if (nums[mid]==target){
if (mid-2>=0)
return mid-2
else
return -1
}else if(nums[mid]>target){
left=mid+1;
}else{
right=mid-1;
}
}
return -1;
}
第三题:
/* C++ */
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
int n = numbers.size();
for (int i = 0; i < n; ++i) {
int l = i + 1, r = n - 1;
int key = target - numbers[i];
while (l < r) {
int mid = l + r >> 1;
if (numbers[mid] >= key) r = mid;
else l = mid + 1;
}
if (numbers[l] == key) return {i + 1, l + 1};
}
return {-1, -1};
}
};