美文网首页
33、搜索旋转排序数组 | 算法(leetode,附思维导图 +

33、搜索旋转排序数组 | 算法(leetode,附思维导图 +

作者: 码农三少 | 来源:发表于2021-12-04 09:58 被阅读0次

    零 标题:算法(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;
    };
    

    相关文章

      网友评论

          本文标题:33、搜索旋转排序数组 | 算法(leetode,附思维导图 +

          本文链接:https://www.haomeiwen.com/subject/wwevxrtx.html