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

131 lines
6.8 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>进入。
# ****
## ****
使
![](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/案例1.2wan88b4sdk0.png)
target -1
使
mid
left 1 2 left 1mid 2
![mid](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/mid值情况.3879bq8s3xk0.png)
nums[mid] nums[left] mid left right nums[mid] >= nums[left] nums[mid] < nums[left] left 1 mid 2.
left mid left 2 mid 1 mid left right left right
mid left target 1
![left](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/left左.6kl90uroee40.png)
1.** mid ** [4,7 4 <= target < 7 target >= nums[left] && target < nums[mid] right = mid -1 left right 1 1
2.** mid ** target [4,7 target = 8 0 <= target <= 2 target nums[left] target > nums[mid] || target < nums[left] left = mid + 1 left right
mid ** 2** target
![right](https://cdn.jsdelivr.net/gh/tan45du/photobed@master/photo/right右.3yvrwxloi3c0.png)
1. target <= nums[right] && target > nums[mid]
> 2
2. target > nums[right] || target < nums[mid]
> mid
leetcode 33
#### [33. ](https://leetcode-cn.com/problems/search-in-rotated-sorted-array/)
####
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
####
.
> nums = [4,5,6,7,8,0,1,2] target = 8
if else if
####
Java Code:
```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;
}
//不落在同一数组的情况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;
}
}
}
//没有查找到
return -1;
}
}
```