SearchInRotatedSortedArrayII

搜索旋转排序数组 II

题目介绍

搜索旋转排序数组 II

已知存在一个按非降序排列的整数数组 nums ,数组中的值不必互不相同。

在传递给函数之前,nums 在预先未知的某个下标 k0 <= k < nums.length)上进行了 旋转 ,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,4,4,5,6,6,7] 在下标 5 处经旋转后可能变为 [4,5,6,6,7,0,1,2,4,4]

给你 旋转后 的数组 nums 和一个整数 target ,请你编写一个函数来判断给定的目标值是否存在于数组中。如果 nums 中存在这个目标值 target ,则返回 true ,否则返回 false

示例1:

1
2
输入:nums = [2,5,6,0,0,1,2], target = 0
输出:true

示例 2:

1
2
输入:nums = [2,5,6,0,0,1,2], target = 3
输出:false

提示:

  • 1 <= nums.length <= 5000
  • −104<=nums[i]<=104
  • 题目数据保证 nums 在预先未知的某个下标上进行了旋转
  • −104<=target<=104

题目解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package algorithm;

public class SearchInRotatedSortedArrayII {

public static boolean search(int[] nums, int target) {

int n = nums.length;
if (n == 0) {
return false;
}
if (n == 1) {
return nums[0] == target;
}
int l = 0, r = n - 1;
while (l <= r) {
int mid = (l + r) / 2;
if (nums[mid] == target) {
return true;
}
if (nums[l] == nums[mid] && nums[mid] == nums[r]) {
++l;
--r;
} else if (nums[l] <= nums[mid]) {
if (nums[l] <= target && target < nums[mid]) {
r = mid - 1;
} else {
l = mid + 1;
}
} else {
if (nums[mid] < target && target <= nums[n - 1]) {
l = mid + 1;
} else {
r = mid - 1;
}
}
}
return false;
}

public static void main(String[] args) {
int[] nums = new int[]{2,5,6,0,0,1,2};
int target = 0;
System.out.println(search(nums, target));

nums = new int[]{2,5,6,0,0,1,2};
target = 3;
System.out.println(search(nums, target));

nums = new int[]{1,0,1,1,1};
target = 0;
System.out.println(search(nums, target));
}
}

打印:

1
2
3
true
false
true

思路:

思路很简单。就是比之前多了一个是否首尾中一致的判断。其实也是很巧妙了。


SearchInRotatedSortedArrayII
https://yangtzeshore.github.io/2021/05/27/SearchInRotatedSortedArrayII/
作者
Chen Peng
发布于
2021年5月27日
许可协议