1 题目描述
给定一个 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]之间。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-search 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 解题思路
终于在好久好久之后… 用两种不同的想法实现了这个题 一种是写left<=right ,写三个分支,不符合结果,直接返回-1
一种是写left<right ,写两个分支,最后进行 补救,看看target是不是跟此时的left相等,相等返回left,否则返回-1
3 解决代码
- 这个是left
<=right ,写三个分支,不符合结果,直接返回
-1
class Solution {
public int search(int[] nums
, int target
) {
int left
= 0;
int right
= nums
.length
- 1;
while(left
<= right
){
int mid
= (left
+ right
) /2;
if (nums
[mid
] == target
){
return mid
;
}
else if (nums
[mid
] < target
){
left
= mid
+1;
}
else if (nums
[mid
] > target
){
right
= mid
-1;
}
}
return -1;
}
}
这个是left<right, 后面考虑对漏掉的相等的情况进行考虑,补救
class Solution {
public int search(int[] nums
, int target
) {
int left
= 0;
int right
= nums
.length
-1;
while(left
< right
){
int mid
= (left
+ right
)/2;
if(nums
[mid
] <target
){
left
= mid
+ 1;
}
else if (nums
[mid
] >=target
){
right
= mid
;
}
}
return nums
[left
] == target
? left
: -1;
}
}