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

200 lines
8.3 KiB
Java
Raw Normal View History

2021-07-23 15:44:19 +00:00
> **[tan45du_one](https://raw.githubusercontent.com/tan45du/tan45du.github.io/master/个人微信.15egrcgqd94w.jpg)** ,备注 github + 题目 + 问题 向我反馈
2021-03-20 09:16:07 +00:00
>
>
>
2021-07-23 15:44:19 +00:00
> <u>[****](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u> 两个平台同步,想要和题友一起刷题,互相监督的同学,可以在我的小屋点击<u>[**刷题小队**](https://raw.githubusercontent.com/tan45du/test/master/微信图片_20210320152235.2pthdebvh1c0.png)</u>进入。
2021-03-20 09:16:07 +00:00
###
2021-03-18 04:21:49 +00:00
>
>
>
>
2021-07-23 15:44:19 +00:00
> 30 26
2021-03-18 04:21:49 +00:00
>
>
>
2021-07-23 15:44:19 +00:00
> 20
2021-03-18 04:21:49 +00:00
>
>
>
2021-07-23 15:44:19 +00:00
> 15
2021-03-18 04:21:49 +00:00
>
> 便
>
2021-07-23 15:44:19 +00:00
> 18
2021-03-18 04:21:49 +00:00
>
>
2021-07-23 15:44:19 +00:00
# ****
2021-03-18 04:21:49 +00:00
##
> Binary Search
2021-07-23 15:44:19 +00:00
nums 8
2021-03-18 04:21:49 +00:00
```java
2021-07-23 15:44:19 +00:00
int[ ] nums = {1,3,4,5,6,8,12,14,16}; target = 8
2021-03-18 04:21:49 +00:00
```
> 1
>
>
2021-03-18 04:47:47 +00:00
![1](https://img-blog.csdnimg.cn/img_convert/b58d55a34b32a342f652792297a1e4d7.png)
2021-03-18 04:21:49 +00:00
2021-07-23 15:44:19 +00:00
> 2 mid mid =left + right/ 2
2021-03-18 04:21:49 +00:00
>
2021-07-23 15:44:19 +00:00
> mid = left +right - left/ 2 left + ((right - left ) >> 1)
2021-03-18 04:21:49 +00:00
>
2021-07-23 15:44:19 +00:00
> 使 mid = 0 + (8-0) / 2 = 4
2021-03-18 04:21:49 +00:00
2021-03-18 04:47:47 +00:00
![2](https://img-blog.csdnimg.cn/img_convert/5354d4c9ea5e5bd28a77a202b4dd3445.png)
2021-03-18 04:21:49 +00:00
2021-07-23 15:44:19 +00:00
> 3 mid = 4nums[mid] = 6 < target, left left = mid + 1 left right
2021-03-18 04:21:49 +00:00
2021-03-18 04:47:47 +00:00
![](https://img-blog.csdnimg.cn/img_convert/97c584c48d6c1c06dffb94c6481f82c6.png)
2021-03-18 04:21:49 +00:00
2021-07-23 15:44:19 +00:00
> 4 left right mid mid = 5 + 8 - 5/ 2 = 6 nums[mid] target left right
2021-03-18 04:21:49 +00:00
2021-03-18 04:47:47 +00:00
![3](https://img-blog.csdnimg.cn/img_convert/471b4093db0233e41d4875fc6b2e4359.png)
2021-03-18 04:21:49 +00:00
> 5 nums[mid] > target right right = mid - 1 left right
2021-03-18 04:47:47 +00:00
![4](https://img-blog.csdnimg.cn/img_convert/2145730bf3a6373f1cf60da628bf85e6.png)
2021-03-18 04:21:49 +00:00
2021-07-23 15:44:19 +00:00
> 6 left right mid mid = 5 +5 - 5/ 2 = 5 nums[mid] target mid -1
2021-03-18 04:21:49 +00:00
2021-03-18 04:47:47 +00:00
![6](https://img-blog.csdnimg.cn/img_convert/0aba81887cfbc25ce9a859ba8137cd4a.png)
2021-03-18 04:21:49 +00:00
1.
2021-07-23 15:44:19 +00:00
2. nums[mid] target nums[mid] target mid
2021-03-18 04:21:49 +00:00
2021-07-23 15:44:19 +00:00
target > nums[mid] left = mid + 1;
2021-03-18 04:21:49 +00:00
2021-07-23 15:44:19 +00:00
target < nums[mid] right = mid -1
2021-03-18 04:21:49 +00:00
****
2021-03-18 04:47:47 +00:00
![2](https://img-blog.csdnimg.cn/img_convert/eb648f86b4ada5b32afc7a52e78d9953.gif)
2021-03-18 04:21:49 +00:00
2021-07-19 06:33:01 +00:00
if
Java Code:
2021-03-18 04:21:49 +00:00
```java
2021-07-19 06:33:01 +00:00
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;
2021-03-18 04:21:49 +00:00
}
}
2021-07-19 06:33:01 +00:00
//没有找到该元素,返回 -1
return -1;
}
2021-03-18 04:21:49 +00:00
```
2021-07-19 06:33:01 +00:00
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
}
```
2021-03-18 04:21:49 +00:00
1. mid 使 left + right / 2,
2021-07-23 15:44:19 +00:00
2.while (left < = right) { } left <= right , left < right left < right left right -1 left right left = right
2021-03-18 04:21:49 +00:00
2021-07-23 15:44:19 +00:00
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
2021-03-18 04:21:49 +00:00
2021-03-18 04:47:47 +00:00
![](https://img-blog.csdnimg.cn/img_convert/d7ff6aba9a1e9d673ae24667823d5770.png)
2021-03-18 04:21:49 +00:00
2021-07-19 06:33:01 +00:00
Java Code:
2021-03-18 04:21:49 +00:00
```java
public static int binarySearch(int[] nums,int target,int left, int right) {
2021-07-26 16:17:05 +00:00
2021-07-19 06:33:01 +00:00
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);
2021-03-18 04:21:49 +00:00
}
}
2021-07-19 06:33:01 +00:00
//不存在返回-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
}
2021-03-18 04:21:49 +00:00
```