二分查找
题目
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不在数组中,返回他将会被按顺序插入数组中的位置。
假设数组中午重复元素。
输入:[1,3,5,6],5
输出:2
输入:[1,3,5,6],2
输出:1
分析
二分查找
1.确定mid(就是中间的数字)
2.如果arr[mid]>target,目标在左半边
3.如果arr[mid]<target,目标在右半边
4.注意循环退出条件–是小于等于,等于也得循环一次
改进二分查找
原始的二分查找,在找不到时会返回-1,该种情况下,需要返回插入的位置。画一下图,会发现插入的位置,为每次begin退出循环时的位置。
时间复杂度 O(logN)
空间复杂度 O(1)
代码
public class SearchInsert {
public int searchInsert(int[] nums, int target) {
if (nums == null || nums.length == 0) {
return -1;
}
int begin = 0;
int end = nums.length - 1;
while (begin <= end) {
// int mid = (begin + end) / 2;
//这么写相比于上面那个 不会两个数字和起来过大 导致内存溢出
int mid = begin + (end - begin) / 2;
if (nums[mid] == target) {
return mid;
} else if (nums[mid] < target) {
begin = mid + 1;
} else {
end = mid - 1;
}
}
return begin;
}
public void test() {
int[] arr = new int[]{1, 3, 5, 6};
int res_1 = searchInsert(arr, 5);
int res_2 = searchInsert(arr, 2);
System.out.println("res_1->" + res_1);
System.out.println("res_2->" + res_2);
}
public static void main(String[] args) {
SearchInsert t = new SearchInsert();
t.test();
}
}