——————————————— 本文章的代码均是JAVA—————————————————
二分查找是一个时间效率极高的算法,尤其是面对大量的数据时,其查找效率是极高
时间复杂度是log(n)。
主要思想就是不断的对半折叠,每次查找都能除去一半的数据量,直到最后将所有不符合条件的结果都去除,只剩下一个符合条件的结果
二分算法
在升序数组nums 中寻找目标值target,对于特定下标 i,比较nums[i] 和target 的大小:
如果 nums[i] = target nums[i]=target,则下标 i即为要寻找的下标;
如果 nums[i] > target }nums[i]>target,则target 只可能在下标 i 的左侧;
如果nums[i] < target nums[i]<target,则target 只可能在下标 i 的右侧。
public class lianxi {
public static void main(String[] args) {
Solution S = new Solution();
int[] nums = new int[] {-1,0,3,5,9,12};
int target = 9;
int a = S.search(nums, target);
System.out.println(a);
}
}
class Solution {
public int search(int[] nums, int target) {
int left = 0;
int len = nums.length - 1;
while(left <= len){
int mid = (left +len) / 2;
if(nums[mid] == target){
return mid;
}
else if(nums[mid] > target){
len = mid - 1;
}
else{
left = mid +1;
}
}
return -1;
}
}
练习题一:第一个错误项
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int left = 1, right = n;
while(left < right) {
int mid = left + (right - left) / 2;//防止溢出,mid是错误号
if(isBadVersion(mid)) {
right = mid;
}
else
{
left = mid + 1;
}
}
return left;
}
}
例题二搜索插入位置:
class Solution {
public int searchInsert(int[] nums, int target) {
int n = nums.length;
int left=0;
int ans=n;
int right=nums.length-1;
while(left<=right)
{
int mid=(left+right)/2;
if(target<=nums[mid]){
ans=mid;
right=mid-1;
}else {
left=mid+1;
}
}
return ans;
}
}
// class Solution {
// public int searchInsert(int[] nums, int target) {
// int len = nums.length;
// for (int i = 0; i < len; i++) {
// if (nums[i] >= target) {
// return i;
// }
// }
// return len;
// }
// }