LeetCode筆記——33搜尋旋轉排列陣列
阿新 • • 發佈:2018-12-11
題目:
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,1,2,4,5,6,7]
可能變為 [4,5,6,7,0,1,2]
)。
搜尋一個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1
。
你可以假設陣列中不存在重複的元素。
你的演算法時間複雜度必須是 O(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2]
, target = 0
輸出: 4
示例 2:
輸入: nums = [4,5,6,7,0,1,2]
, target = 3
輸出: -1
思路:我直接看了網上大神的寫法。要求的時間複雜度必須是 O (log n),所以使用二分法來做。題目中的旋轉實際上就是左右兩個部分調換,變成了兩個有序的部分。
程式碼:
class Solution { public int search(int[] nums, int target) { if(nums.length==0) { return -1; } int st = 0,end = nums.length-1; while(st <= end) { int mid = st+(end-st)/2; if(nums[mid]==target) { return mid; } if(nums[mid]>=nums[st]) { if(nums[st]<=target&&target<nums[mid]
} }
執行最快的程式碼
基本上也是二分法的思想
class Solution {
public int search(int[] nums, int target) {
if (nums == null || nums.length == 0) return -1;
int start = 0, end = nums.length - 1;
while (start < end) {
int mid = (start + end) / 2;
if (nums[mid] > nums[end]) { // eg. 3,4,5,6,1,2
if (target > nums[mid] || target <= nums[end]) {
start = mid + 1;
} else {
end = mid;
}
} else { // eg. 5,6,1,2,3,4
if (target > nums[mid] && target <= nums[end]) {
start = mid + 1;
} else {
end = mid;
}
}
}
if (start == end && target != nums[start]) return -1;
return start;
}
}