题目概述
给定一个升序数组nums和一个整数target, 用二分查找查找target是否在nums中,如果在,返回对应元素的index,如果不在,返回-1。
题目地址:https://leetcode-cn.com/leetbook/read/binary-search/xexoac/
一、解题思路
利用左右两个浮标标注二分查找的区域,初始状态下,左浮标在0位,右浮标在nums.length-1位。循环语句用index开始从数组中间查找,如果index指向的元素小于target,更新右浮标,如果大于target,则更新左浮标,如果等于就跳出循环。
这道题目的边界条件需要处理:
1)数组只有一个元素的情况
2)target小于数组第一个元素,target大于数组最后一个元素
3)target等于数组第一个元素或数组最后一个元素
二、作业记录
1.作业代码
代码如下:
class Solution {
public int search(int[] nums, int target) {
//处理数组只有一个元素的情况
if( nums.length == 1 && nums[0] != target)
return -1;
// 初始化浮标
int left, right, index;
left = 0;
right = nums.length -1;
index = (right - left) / 2;
//处理target超出数组范围的情况
if( nums[left] > target)
return -1;
if( nums[right] < target)
return -1;
// 循环开始
while( nums[index] != target){
// 浮标对应元素等于target的情况
if( nums[index] == target)
break;
if( nums[left] == target)
return left;
if( nums[right] == target)
return right;
// index对应元素小于target,搜索区间向右收缩
if( nums[index] < target){
left = index;
index = left + (right - left)/2;
}
// index对应元素大于target,搜索区间向左收缩
if( nums[index] > target){
right = index;
index = right - right/2;
}
// 搜索区间无法二分,仍然没有找到target
if( left == right - 1 && nums[index] != target)
return -1;
}
return index;
}
}
2.作业表现
表现如下:
用时满足要求。内存消耗似乎不太好,但是我暂时也想不出优化的办法,先这样吧。等我把JVM的内存问题课程看完,说不定会有新思路。
复杂度分析
时间复杂度:题目要求是O(logn)的复杂度,我的思路是搜索区间对折的处理,应该是达标了。
空间复杂度:由于只用了3个浮标,常量级的额外存储,我认为复杂度是O(1)。