33、搜索旋转排序数组|33、搜索旋转排序数组 | 算法(leetode,附思维导图 + 全部解法)300题

零 标题:算法(leetode,附思维导图 + 全部解法)300题之(33)搜索旋转排序数组 一 题目描述! 题目描述
33、搜索旋转排序数组|33、搜索旋转排序数组 | 算法(leetode,附思维导图 + 全部解法)300题
文章图片

二 解法总览(思维导图) 33、搜索旋转排序数组|33、搜索旋转排序数组 | 算法(leetode,附思维导图 + 全部解法)300题
文章图片

三 全部解法 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
【33、搜索旋转排序数组|33、搜索旋转排序数组 | 算法(leetode,附思维导图 + 全部解法)300题】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; };

    推荐阅读