33. Search in Rotated Sorted Array
Leetcode
題目
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1Input: nums = [1], target = 0
Output: -1解答
測資
Last updated
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1Input: nums = [1], target = 0
Output: -1Last updated
var search = function(nums, target) {
const getRotateIndex = () => {
let rotateIndex = 0;
let low = 0;
let high = nums.length - 1;
while(low < high) {
const mid = Math.ceil((low+high) / 2);
if(nums[mid] > nums[rotateIndex]) {
rotateIndex = mid;
low = mid;
} else {
high = mid - 1;
}
}
return rotateIndex;
}
// 找出矩陣最大值的 index
const rotateIndex = getRotateIndex();
// 目標值是否該從左邊開始找
const isSearchLeftPart = target >= nums[0];
let [low, high] = isSearchLeftPart ? [0, rotateIndex] : [rotateIndex + 1, nums.length - 1]
// console.log(rotateIndex, low, high)
while(low < high) {
const mid = Math.floor((low+high) / 2);
if(target === nums[mid]) return mid;
if(target < nums[mid]) {
high = mid;
} else {
low = mid + 1;
}
}
// 如果找到最後還是不等於 target 的話,等於不存在 return -1
return nums[low] !== target ? -1 : low;
};var search = function(nums, target) {
let low = 0;
let high = nums.length - 1;
if(target === nums[0]) return 0;
while(low < high) {
const mid = Math.floor((low+high) / 2);
if(target === nums[mid]) return mid;
// 代表 mid 的位置是在 nums 矩陣的左邊
if(nums[mid] >= nums[0]) {
// target 在 nums 矩陣的左邊
if(target > nums[0]) {
if(target > nums[mid]) low = mid + 1;
else high = mid;
} else low = mid + 1;
} else {
// target 在 nums 矩陣的左邊,但是 mid 在 nums 矩陣右邊,所以 high 設成 mid
if(target > nums[0]) high = mid;
else {
// target 在 nums 矩陣的右邊,mid 在 nums 矩陣右邊,且 target > nums[mid]
// 所以往右邊找 low 設成 mid + 1
if(target > nums[mid]) low = mid + 1;
else high = mid;
}
}
}
return nums[low] !== target ? -1 : low;
};let nums = [4,5,6,7,0,1,2], target = 0; // 4
// nums = [4,5,6,7,0,1,2], target = 3; // -1
// nums = [1], target = 0; // -1
// nums = [1], target = 1; // 0
// nums = [1, 3], target = 3; // 1
console.log(search(nums, target))