1 題目描述
2 解題思路
-
方法一:暴力法(Brute Force)
無視題目“你的算法時間複雜度必須是 O(\log n)O(logn) 級別”這項要求,採用線性掃描的方式搜索。 -
方法二:二分查找(Binary Search)
原文連接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/solution/er-fen-fa-python-dai-ma-java-dai-ma-by-liweiwei141/
3 解決代碼
- 方法一:暴力法(Brute Force)《Java代碼》
public class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
for (int i = 0; i < len; i++) {
if (nums[i] == target) {
return i;
}
}
return -1;
}
}
- 方法二:二分查找(Binary Search)《Java代碼》
class Solution {
public int search(int[] nums, int target) {
int len = nums.length;
if(len == 0){
return -1;
}
int left = 0;
int right = len - 1;
while(left < right){
// 使用上取整的中間數,必須在上面的 mid 表達式的括號裏 + 1
int mid = left + (right - left + 1) / 2;
//目標值target在右邊區間,右邊有序
if(nums[mid] < nums[right]){
if(nums[mid] <= target && target<= nums[right]){
// 下一輪搜索區間是 [mid, right]
left = mid;
}
else{
// 只要上面對了,這個區間是上面區間的反面區間,下一輪搜索區間是 [left, mid - 1]
right = mid - 1;
}
}
else{
//爲了保證mid的一致性,我們設left到mid-1 有序,實際上是到mid的
//當區間只有 2 個元素的時候 int mid = (left + right + 1) >>> 1; 一定會取到右邊
// 此時 mid - 1 不會越界,就是這麼剛剛好
if(nums[left] <= target &&target <= nums[mid - 1]){
// 下一輪搜索區間是 [left, mid - 1]
right = mid - 1;
}
else{
//下一輪搜索區間是 [mid, right]
left = mid;
}
}
}
// 跳出循環後,有可能區間內不存在目標元素,因此還需做一次判斷
if(nums[left] == target){
return left;
}
return -1;
}
}