二分查找前提:
1.所要查找的数组为有序数组
2.数组中没有重复元素
题目来自LeetCode 704 二分查找https://leetcode.cn/problems/binary-search/
题目如下:
704:给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
可以用二分查找:
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0;
int right=nums.size()-1;
while(left<=right) //[left,right]左右边界为闭区间,用while(<=)
{
int mid=left+(right-left)/2; //用left+(right-left)/2 防止溢出
if(target==nums[mid])
{
return mid;
}
else if(target<nums[mid])
{
right=mid-1;
}
else if(target>nums[mid])
{
left=mid+1;
}
}
return -1;
}
};
题目来自LeetCode 167 两数之和||—输入有序数组https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/
167:给你一个下标从 1 开始的整数数组 numbers ,该数组已按 非递减顺序排列 ,请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这两个数分别是 numbers[index1] 和 numbers[index2] ,则 1 <= index1 < index2 <= numbers.length 。
可以用遍历+二分法
使x=target-nums[i]; 再使用二分法查找值x;(注意二分法的左右边界限制)
class Solution {
public:
vector<int> twoSum(vector<int>& numbers, int target) {
vector<int>arr;
int right=numbers.size()-1;
for(int i=0;i<numbers.size();i++)
{
int x=target-numbers[i];
int left=i+1; //注意边界的范围
while(left<=right)
{
int mid=left+(right-left)/2;
if(numbers[mid]==x)
{
arr.push_back(i+1);
arr.push_back(mid+1);
return arr;
}
else if(numbers[mid]<x)
{
left=mid+1;
}
else{
right=mid-1;
}
}
}
return arr;
}
};