Description
给定一个 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]之间。
Solution
- 用二分的前提是升序且不重复。
- 需要注意边界条件的细节。
- 全闭能等,右闭减开不减。
左右闭合
- [left, right] -> 都能取到,所以left 从 第一个下标(0)开始,right 从最后一个下标开始(nums.length - 1)。
- left 和 right 可能会相等,所以while 条件里是 <=。
- 因为左右皆闭合,如果nums[middle] <> target, 左右需要加减1。
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
while (left <= right){
int middle = left + (right - left) / 2;
if (nums[middle] > target){
right = middle -1 ;
}
else if (nums[middle] < target){
left = middle + 1;
}
else {
return middle;
}
}
return -1;
}
};
左闭右开
- [left, right) -> right 需要超出边界1位,所以left 从 第一个下标(0)开始,right 从最后一个下标+1开始(nums.length )。
- left 和 right 不可能相等,所以while 条件里是 <。
- 因为左闭右开,如果nums[middle] <> target, 左需要加1,右不需要减1。
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length;
while (left < right){
int middle = left + (right - left) / 2;
if (nums[middle] > target){
right = middle ;
}
else if (nums[middle] < target){
left = middle + 1;
}
else {
return middle;
}
}
return -1;
}
};
Notice Points
关于计算长度的几个方法
- length : Arrays (int[], double[], String[]) — 取得Array的长度
- length() : String related Object(String, StringBuilder, etc) — 取得字符串的长度
- size() : Collection Object (ArrayList, Set, etc) — 取得泛型集合大小
import java.util.*;
public class HelloWorld{
public static void main(String []args){
String[] arr = {"a", "b", "c"};
String s = "123456";
Set<String> set = new HashSet();
set.add("example");
System.out.println(arr.length); //3
System.out.println(s.length()); //6
System.out.println(set.size()); //1
}
}