算法60天训练:9.6 day1(数组)----二分查找
数组理论基础
在C++中,数组是以连续的地址存在,而在Java中,数组的地址并不是连续的
思路
从题目中可以看出,数组中的元素是有序的,而且是不重复的,很满足二分法的使用条件,所以使用二分法来解决这道题,同时二分有两种情况,一种是左闭右闭,一种是左闭右开,而这两种情况在代码的形式上是不一样的.
解题方法
以right == left(两边顶点)
为终止条件,根据左闭又开或左闭右闭来调整每一轮循环之后right
和left
两边端点的位置.始终将target
在端点之间,直到right = left
.
复杂度
时间复杂度:
O(log n)
空间复杂度:
O(1)
Code[JAVA]
class Solution {
public int search(int[] nums, int target) {
int left = 0, right = nums.length;
while(left < right) {
int mid = right+left >> 1;
if(nums[mid] > target){
right = mid;
}
else if(nums[mid] < target){
left = mid+1;
}
else return mid;
}
return -1;
}
}
Code[C++]
class Solution {
public:
int search(vector<int>& nums, int target) {
int left = 0;
int right = nums.size()-1;
while(left <= right){
int middle = left + ((right-left)>>1);
if(nums[middle] < target){
left = middle+1;
}
if(nums[middle] > target){
right = middle-1;//右开
}
if(nums[middle] == target){
return middle;
}
}
return -1;
}
};