题目:
Given a sorted (in ascending order) integer array nums of n elements and a target value, write a function to search target in nums. If target exists, then return its index, otherwise return -1.
Example 1:
Input:nums= [-1,0,3,5,9,12],target= 9 Output: 4 Explanation: 9 exists innumsand its index is 4
Example 2:
Input:nums= [-1,0,3,5,9,12],target= 2 Output: -1 Explanation: 2 does not exist innumsso return -1
Note:
- You may assume that all elements in
numsare unique. nwill be in the range[1, 10000].- The value of each element in
numswill be in the range[-9999, 9999].
真·vanilla binary search,没啥好说的了,就直接写了。
Runtime: 0 ms, faster than 100.00% of Java online submissions for Binary Search.
Memory Usage: 39.7 MB, less than 6.60% of Java online submissions for Binary Search.
class Solution {
public int search(int[] nums, int target) {
int low = 0;
int high = nums.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (target > nums[mid]) {
low = mid + 1;
} else if (target < nums[mid]) {
high = mid - 1;
} else {
return mid;
}
}
return -1;
}
}
2022.11.5
还是看了一下discussion高票的binary search 101,大概搞明白了一点东西。Loading...
之前一直喜欢用while (low <= high) 配上大于小于等于三种情况分别对应+1 -1 return,因为这样比较清晰。看了这篇101大概知道了只写两个条件的怎么记住如何+1 -1对应。
首先是采用两种情况的话,while里写的就是low < high,因为最后的退出条件是low == high,此时的这个元素就是我们要求的。接下来是对mid的讨论:
1. 如果mid = (high - low) / 2,向下取整,那么此时需要分类的情况就是target < mid时,high = mid - 1,其他情况就是low = mid,还是需要把mid考虑进来。想这个的时候可以就拿两个元素时想,如果向下取整,mid = 0,target = 0 which is mid的话是不会进入这个if的,进入else了以后应该把low更新成mid,这样下次low == high就退出循环了。
2. 同理,如果mid = (high - low + 1) / 2,向上取整,分类条件就是target > mid,low = mid + 1;其他情况high = mid。
但是这么做真的容易出错啊,还是三个分类条件和low <= high最安全稳妥了!
2023.8.30
历尽千辛万苦凭借一己之力居然写出来了插入数字找index的版本……也是用的low <= high的分类方式,居然给自己整出来了,啊,赶紧记录一下!
就还是类似的分类方式,if条件也一样。最后low和high的位置其实就是这个数字应该插入的地方,排列顺序应该是这样的:high, num, low。
需要注意的是,可能会出现high == -1或者low == nums.length的溢出情况,如果high都到-1了那就说明num应该插在最前面,如果low都超出数组范围了那就说明num应该插在最后面。下面的代码没有经过验证,但我感觉high + 1应该就能概括上述的所有情况。
class Solution {
public int getIndex(int[] nums, int target) {
int low = 0;
int high = nums.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (target > nums[mid]) {
low = mid + 1;
} else if (target < nums[mid]) {
high = mid - 1;
} else {
return mid;
}
}
return high + 1;
}
}
这篇博客详细介绍了如何实现二分查找算法,并对比了不同取整方式下的实现细节。作者分享了对于二分查找的理解,包括在有序数组中搜索目标值时的边界条件处理。同时,还提及了自己独立完成的插入数字找index版本的二分查找,讨论了可能出现的溢出情况及其解决方案。
904

被折叠的 条评论
为什么被折叠?



