今天开始重刷题,写文章算是监督吧,希望自己能坚持下来,加油!!!
题目
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4
示例 2:
输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1
提示:
你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。
代码
class Solution {
public int search(int[] nums, int target) {
int first=0;
int end=nums.length-1;
while(first<=end){
int mid=(first+end)/2;
if(nums[mid]==target)
return mid;
else if(nums[mid]>target)
end=mid-1;
else first=mid+1;
}
return -1;
}
}
易错点
1、由于很久没有写java代码,在计算数组长度就出问题了,,,,用来nums.size()然后报错了
2、在while的约束条件出问题了,由于设定的end是length-1,因此为了应对数组只有一个数,while的约束条件应该是first<=end
巧妙点
1、mid=(first+end)/2,保证了序号一致性
总结
1、数组为有序数组,同时数组中无重复元素,这些都是使用二分法的前提条件,当大家看到题目描述满足如上条件的时候,可要想一想是不是可以用二分法了。
2、就是while的约束条件,end定义含义的对应。