33、搜尋旋轉排序陣列 | 演算法(leetode,附思維導圖 + 全部解法)300題

碼農三少發表於2021-12-04

零 標題:演算法(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;
};

相關文章