algorithm-base/animation-simulation/二分查找及其变种/二分查找详解.md

200 lines
8.3 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

> **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
>
>
>
> <u>[****](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
###
>
>
>
>
> 30 26
>
>
>
> 20
>
>
>
> 15
>
> 便
>
> 18
>
>
# ****
##
> Binary Search
nums 8
```java
int[ ] nums = {1,3,4,5,6,8,12,14,16}; target = 8
```
> 1
>
>
![1](https://img-blog.csdnimg.cn/img_convert/b58d55a34b32a342f652792297a1e4d7.png)
> 2 mid mid =left + right/ 2
>
> mid = left +right - left/ 2 left + ((right - left ) >> 1)
>
> 使 mid = 0 + (8-0) / 2 = 4
![2](https://img-blog.csdnimg.cn/img_convert/5354d4c9ea5e5bd28a77a202b4dd3445.png)
> 3 mid = 4nums[mid] = 6 < target, left left = mid + 1 left right
![](https://img-blog.csdnimg.cn/img_convert/97c584c48d6c1c06dffb94c6481f82c6.png)
> 4 left right mid mid = 5 + 8 - 5/ 2 = 6 nums[mid] target left right
![3](https://img-blog.csdnimg.cn/img_convert/471b4093db0233e41d4875fc6b2e4359.png)
> 5 nums[mid] > target right right = mid - 1 left right
![4](https://img-blog.csdnimg.cn/img_convert/2145730bf3a6373f1cf60da628bf85e6.png)
> 6 left right mid mid = 5 +5 - 5/ 2 = 5 nums[mid] target mid -1
![6](https://img-blog.csdnimg.cn/img_convert/0aba81887cfbc25ce9a859ba8137cd4a.png)
1.
2. nums[mid] target nums[mid] target mid
target > nums[mid] left = mid + 1;
target < nums[mid] right = mid -1
****
![2](https://img-blog.csdnimg.cn/img_convert/eb648f86b4ada5b32afc7a52e78d9953.gif)
if
Java Code:
```java
public static int binarySearch(int[] nums,int target,int left, int right) {
//这里需要注意,循环条件
while (left <= right) {
//这里需要注意计算mid
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
return mid;
}else if (nums[mid] < target) {
//这里需要注意,移动左指针
left = mid + 1;
}else if (nums[mid] > target) {
//这里需要注意,移动右指针
right = mid - 1;
}
}
//没有找到该元素,返回 -1
return -1;
}
```
Go Code:
```go
func binarySearch(nums []int, target, left, right int) int {
//这里需要注意,循环条件
for left <= right {
//这里需要注意计算mid
mid := left + ((right - left) >> 1)
if nums[mid] == target {
return mid
} else if nums[mid] < target {
//这里需要注意,移动左指针
left = mid + 1
} else if nums[mid] > target {
//这里需要注意,移动右指针
right = mid - 1
}
}
//没有找到该元素,返回 -1
return -1
}
```
1. mid 使 left + right / 2,
2.while (left < = right) { } left <= right , left < right left < right left right -1 left right left = right
3. left = mid + 1,right = mid - 1 left = mid right = mid, target 16 left = 7 right = 8mid = left + (right - left) = 7 + (8-7) = 7 left = mid mid 7
![](https://img-blog.csdnimg.cn/img_convert/d7ff6aba9a1e9d673ae24667823d5770.png)
Java Code:
```java
public static int binarySearch(int[] nums,int target,int left, int right) {
if (left <= right) {
int mid = left + ((right - left) >> 1);
if (nums[mid] == target) {
//查找成功
return mid;
}else if (nums[mid] > target) {
//新的区间,左半区间
return binarySearch(nums,target,left,mid-1);
}else if (nums[mid] < target) {
//新的区间,右半区间
return binarySearch(nums,target,mid+1,right);
}
}
//不存在返回-1
return -1;
}
```
Go Code:
```go
func binarySearch(nums []int, target, left, right int) int {
if left <= right {
mid := left + ((right - left) >> 1)
if nums[mid] == target {
//查找成功
return mid
} else if nums[mid] > target {
//新的区间,左半区间
return binarySearch(nums, target, left, mid-1)
} else if nums[mid] < target {
//新的区间,右半区间
return binarySearch(nums, target, mid+1, right)
}
}
//不存在返回-1
return -1
}
```