题目地址:搜索旋转排序数组Ⅱ
题目简介:
假设按照升序排序的数组在预先未知的某个点上进行了旋转。(例如,数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] 。
编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true,否则返回 false。
示例 1:
输入: nums = [2,5,6,0,0,1,2], target = 0
输出: true
示例 2:
输入: nums = [2,5,6,0,0,1,2], target = 3
输出: false
进阶:本题中的 nums 可能包含重复元素,这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?
题目解析:
因为旋转后,可以将数组看作两个子数组。只要目标值比nums[0]大,就说明可能存在前半部分的数组。如果比nums的最后一个数字小,说明可能存在后半部分的数组里面。
时间复杂度还是O(N),但是会在重复的数上进行了浪费时间。
C++版:
class Solution {
public:
bool search(vector<int>& nums, int target) {
if (nums.size() == 0)
return false;
int len = nums.size();
if (target >= nums[0])
{//前半部分
for (int i = 0; i < len; i++)
{
if (target == nums[i])
return true;
else if (target < nums[i])
return false;
}
}
else if (target <= nums[len - 1])
{//后半部分
for (int i = len - 1; i >= 0; i--)
{
if (target == nums[i])
return true;
else if (target > nums[i])
return false;
}
}
return false;
}
};
Python版:
class Solution:
def search(self, nums: List[int], target: int) -> bool:
if len(nums) == 0:
return False;
length = len(nums)
if target >= nums[0]:
for i in range(length):
if target == nums[i]:
return True
elif target < nums[i]:
return False
elif target <= nums[length - 1]:
for i in range(length - 1, -1, -1):
if target == nums[i]:
return True;
elif target > nums[i]:
return False;
return False;