algorithm-base/animation-simulation/二分查找及其变种/leetcode33不完全有序查找目标元素(不包含重复...

131 lines
6.8 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 05:33:53 +00:00
# ****
## ****
使
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/案例1.2wan88b4sdk0.png)
2021-07-23 15:44:19 +00:00
target -1
2021-03-18 05:33:53 +00:00
使
mid
2021-07-23 15:44:19 +00:00
left 1 2 left 1mid 2
2021-03-18 05:33:53 +00:00
![mid](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/mid值情况.3879bq8s3xk0.png)
2021-07-23 15:44:19 +00:00
nums[mid] nums[left] mid left right nums[mid] >= nums[left] nums[mid] < nums[left] left 1 mid 2.
2021-03-18 05:33:53 +00:00
2021-07-23 15:44:19 +00:00
left mid left 2 mid 1 mid left right left right
2021-03-18 05:33:53 +00:00
2021-07-23 15:44:19 +00:00
mid left target 1
2021-03-18 05:33:53 +00:00
![left](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/left左.6kl90uroee40.png)
2021-07-23 15:44:19 +00:00
1.** mid ** [4,7 4 <= target < 7 target >= nums[left] && target < nums[mid] right = mid -1 left right 1 1
2021-03-18 05:33:53 +00:00
2021-07-23 15:44:19 +00:00
2.** mid ** target [4,7 target = 8 0 <= target <= 2 target nums[left] target > nums[mid] || target < nums[left] left = mid + 1 left right
2021-03-18 05:33:53 +00:00
2021-07-23 15:44:19 +00:00
mid ** 2** target
2021-03-18 05:33:53 +00:00
![right](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/right右.3yvrwxloi3c0.png)
1. target <= nums[right] && target > nums[mid]
2021-07-23 15:44:19 +00:00
> 2
2021-03-18 05:33:53 +00:00
2. target > nums[right] || target < nums[mid]
> mid
leetcode 33
2021-03-20 09:16:07 +00:00
#### [33. ](https://leetcode-cn.com/problems/search-in-rotated-sorted-array/)
2021-03-18 05:33:53 +00:00
####
nums target
[0,1,2,4,5,6,7] [4,5,6,7,0,1,2]
target -1
1
> nums = [4,5,6,7,0,1,2], target = 0
> 4
2
> nums = [4,5,6,7,0,1,2], target = 3
> -1
3
> nums = [1], target = 0
> -1
####
.
2021-07-23 15:44:19 +00:00
> nums = [4,5,6,7,8,0,1,2] target = 8
2021-03-18 05:33:53 +00:00
if else if
####
2021-07-17 15:58:15 +00:00
Java Code:
2021-03-18 05:33:53 +00:00
```java
class Solution {
public int search(int[] nums, int target) {
//左右指针
int left = 0;
int right = nums.length - 1;
while (left <= right) {
int mid = left+((right-left)>>1);
if (nums[mid] == target) {
return mid;
}
//落在同一数组的情况同时落在数组1 或 数组2
if (nums[mid] >= nums[left]) {
//target 落在 left 和 mid 之间则移动我们的right完全有序的一个区间内查找
if (nums[mid] > target && target >= nums[left]) {
right = mid - 1;
// target 落在right和 mid 之间有可能在数组1 也有可能在数组2
} else if (target > nums[mid] || target < nums[left]) {
left = mid + 1;
2021-07-23 15:44:19 +00:00
}
2021-03-18 05:33:53 +00:00
//不落在同一数组的情况left 在数组1 mid 落在 数组2
}else if (nums[mid] < nums[left]) {
//有序的一段区间target 在 mid 和 right 之间
if (nums[mid] < target && target <= nums[right]) {
left = mid + 1;
// 两种情况target 在left 和 mid 之间
} else if (target < nums[mid] || target > nums[right]) {
right = mid - 1;
}
2021-07-23 15:44:19 +00:00
}
2021-03-18 05:33:53 +00:00
}
//没有查找到
return -1;
}
}
```