Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,0,1,2,2,5,6]
might become [2,5,6,0,0,1,2]
).
You are given a target value to search. If found in the array return true
, otherwise return false
.
Example 1:
Input: nums = [2,5,6,0,0,1,2], target = 0 Output: true
给一个有重复值、升序排列但被旋转过的数组,找出有没有指定值
第一种,麻烦且不高级。。
class Solution {
public boolean search(int[] nums, int target) {
if (nums.length < 1)
return false;
int start = 0, end = nums.length-1;
if (target > nums[start]){
for (int i = 0; i < nums.length; i++){
if (nums[i] == target)
return true;
}
}
else if (target < nums[end]){
for (int i = end; i >= 0; i--){
if (nums[i] == target)
return true;
}
}
return target==nums[start] || target==nums[end];
}
}
二分查找:同样是讨论区看到的答案,类似二分查找,在代码中加了一些注释,有什么问题欢迎留言交流
class Solution {
public boolean search(int[] nums, int target) {
int low = 0, hi = nums.length - 1, mid =-1;
while (low <= hi){
mid = low + (hi - low)/2;
if (nums[mid] == target)
return true;
// 当数组左边是升序序列
if (nums[low] < nums[mid]){
// 判断target位置
if (target > nums[mid] || target < nums[low])
low = mid+1;
else hi = mid-1;
}// 如果数组右边是升序序列
else if (nums[low] > nums[mid]){
if (target < nums[mid] || target > nums[hi])
hi = mid-1;
else low = mid+1;
}else {
low++;
}
}
return false;
}
}