给定一个
n
个元素有序的(升序)整型数组nums
和一个目标值target
,写一个函数搜索nums
中的target
,如果目标值存在返回下标,否则返回-1
。示例 1:
输入:nums
= [-1,0,3,5,9,12],target
= 9 输出: 4 解释: 9 出现在nums
中并且下标为 4
二分查找 我们要注意的是区间开闭一般是有两种情况,[左闭右闭 ]和[左闭右开)
对应的while(left<right)加不加等号,和right=mid-1还是right = mid 上面这道题我们将它写成左闭右闭的形式,当然也可以写成左闭右开的形式即写成right=nums.length,左闭右闭时写成right=nums.length-1
public class SearchErfen {
int[] nums = new int[]{-1,0,3,5,9,12};
int target = 9;
public int search(int[] nums, int target) {
int left = 0;
int right = nums.length - 1;
int mid = (left + right) / 2;
while (left <= right) {
if (nums[mid] == target)
return mid;
else if (nums[mid] < target)
left = mid + 1;
else
right = mid - 1;
mid = (left + right) / 2;
}
return -1;
}
public static void main(String[] args) {
SearchErfen searchErfen = new SearchErfen(); // 创建SearchErfen类的实例
int result = searchErfen.search(searchErfen.nums, searchErfen.target); // 调用search方法
if (result != -1) {
System.out.println("目标元素 " + searchErfen.target + " 在数组中的索引是:" + result);
} else {
System.out.println("目标元素 " + searchErfen.target + " 未在数组中找到");
}
}
}
下面我们来写下左闭右开的情况
public int search(int[] nums, int target) {
int left=0;
int right = nums.length;
while(left<right)
{
int mid = (left+right)/2;
if (nums[mid] == target)
return mid;
else if (nums[mid]<target) {
left = mid +1;
}
else right = mid;
}
return -1;
}