无脑暴力遍历:
python
class Solution:
def search(self, nums: List[int], target: int) -> int:
for i in nums:
if i == target:
return nums.index(i)
return -1
二分查找
python
class Solution:
def search(self, nums: List[int], target: int):
if nums == None:
return -1
n = len(nums)
l, r = 0, n-1
while l <= r:
mid = (l + r) // 2
if nums[mid] == target:
return mid
if nums[0] <= nums[mid]:
if nums[0] <= target < nums[mid]:
r = mid - 1
else:
l = mid + 1
else:
if nums[mid] < target <= nums[n-1]:
l = mid + 1
else:
r = mid - 1
return -1
c++
class Solution {
public:
int search(vector<int>& nums, int target) {
// 画图后很好理解,旋转后的数组就像一个断崖,断崖左侧的数都比右侧的数大
// 需要知道mid在断崖的左侧还是右侧:如果nums[mid] >= nums[left],则mid落在断崖左侧,否则为右侧
// 此时nums[left:mid]有序(左侧)或nums[mid:right]有序(右侧),从而缩小一半搜索区间
int n = nums.size();
int left = 0, right = nums.size()-1;
while (left <= right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) {
return mid;
}
if (nums[mid] >= nums[left]) { // mid落在断崖左侧
// target落在nums[left:mid]有序子数组中
if (target >= nums[left] && target < nums[mid]) {
right = mid - 1;
} else { // target落在nums[mid:right]中,但是否有序不知道,需要下一步循环接着判断mid和左右侧的关系
left = mid + 1;
}
} else { // mid落在断崖右侧
// target落在nums[mid:right]有序子数组中
if (target <= nums[right] && target > nums[mid]) {
left = mid + 1;
} else { // target落在nums[left:mid]中,但是否有序不知道,需要下一步循环接着判断mid和左右侧的关系
right = mid - 1;
}
}
}
return -1;
}
};