对于一个有序数组,我们可以进行,二分查找,时间复杂度为O(log2)
主要问题
1.中位数的查找:mid = (left + right) / 2;当left和right差值为1时,mid就不再更新,因为两个相邻的数相加必然是奇数,然而计算机中的整数除法会舍弃小数部分。
2.结束循环的条件
一、
- 每次使mid必然移动一个,若要使mid改变,必然mid位置的值不等于目标值,所以直接使left/right多移动一格
mid = left + 1;
mid = right - 1;
- while()的终止条件设为,left<=right 是由于当left和right相邻时,left 和 right ,此时mid = left,若nums[left] != target 则left必然向右移动,即left == right,此时left还没有进行比较
class Solution {
public:
int search(vector<int>& nums, int target) {
if(nums.empty())return -1;
int left = 0;
int right = nums.size() - 1;
int mid;
while(left <= right){
mid = (left + right) / 2;
if(nums[mid] < target)
left = mid + 1