零 题目:算法(leetode,附思维导图 + 全副解法)300题之(33)搜寻旋转排序数组
一 题目形容
二 解法总览(思维导图)
三 全副解法
1 计划1
1)代码:
// 计划1 “忽视要求,间接调用 indexOf 等函数”
var search = function(nums, target) {
return nums.indexOf(target);
};
2 计划2
1)代码:
// 计划2 “忽视要求,单指针”
// 技巧:
// 1)nums是有序的,而后以某个下标进行翻转。
// 2)通过观察,能够得悉 新的nums 走势根本就是 “升序-降序-升序”。
// 思路(整体分2种状况):
// 1)状态初始化
// 2)分 2种 状况 。
// 2.1)若 nums[left] <= target ,则 一直判断 nums[left] === target 。
// 若 相等,则 间接返回 left,否则 left++ 。
// 2.2)若 nums[right] >= target ,则 一直判断 nums[right] === target 。
// 若 相等,则 间接返回 right,否则 right-- 。
var search = function(nums, target) {
// 1)状态初始化
const l = nums.length;
let left = 0,
right = l - 1;
// 2)分 2种 状况 。
// 2.1)若 nums[left] <= target ,则 一直判断 nums[left] === target 。
// 若 相等,则 间接返回 left,否则 left++ 。
if (nums[left] <= target) {
while(left < l) {
if (nums[left] === target) {
return left;
}
left++;
}
return -1;
}
// 2.2)若 nums[right] >= target ,则 一直判断 nums[right] === target 。
// 若 相等,则 间接返回 right,否则 right-- 。
else if(nums[right] >= target){
while(right >= 0) {
if (nums[right] === target) {
return right;
}
right--;
}
return -1;
}
// 边界case: [4,5,6,7,0,1,2] 3
return -1;
}
3 计划3
1)代码:
// 计划3 “二分查找”。
// 技巧:O(log n)的工夫复杂度 --> “二分查找” 。
// 参考:
// 1)https://leetcode-cn.com/problems/search-in-rotated-sorted-array/solution/ji-jian-solution-by-lukelee/
var search = function(nums, target) {
const l = nums.length;
let left = 0,
right = l - 1;
while (left < right) {
let mid = parseInt((left + right) / 2);
if ((nums[0] > target) ^ (nums[0] > nums[mid]) ^ (target > nums[mid])) {
left = mid + 1;
}
else {
right = mid;
}
}
return left === right && nums[left] === target ? left : -1;
};
发表回复