成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[Leetcode] Search in Rotated Sorted Array 搜索旋轉(zhuǎn)有序數(shù)組

thursday / 641人閱讀

摘要:如果左邊的點(diǎn)比右邊的大,說明這兩個點(diǎn)之間有一個旋轉(zhuǎn)點(diǎn),導(dǎo)致了不再有序。因?yàn)橹挥幸粋€旋轉(zhuǎn)點(diǎn),所以一分為二后,肯定有一半是有序的。

Search in Rotated Sorted Array I
Suppose a sorted array is rotated at some pivot unknown to you beforehand.

(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

最新更新請見:https://yanjia.me/zh/2019/01/...

二分法 復(fù)雜度

時間 O(logN) 空間 O(1)

思路

平時我們二分法的時候,直接判斷下中點(diǎn)和目標(biāo)的關(guān)系,就可以知道目標(biāo)在左半部分還是右半部份了,這背后其實(shí)隱含一個假設(shè),那就是從起點(diǎn)到終點(diǎn)是一段有序的序列。而本題中,如果我們還想繼續(xù)做二分法,這個假設(shè)就不存在了,因?yàn)閺钠瘘c(diǎn)到終點(diǎn)有可能有個斷片!不過,旋轉(zhuǎn)有序數(shù)組有一個特點(diǎn),假設(shè)本身是個升序序列,從左向右。如果左邊的點(diǎn)比右邊的點(diǎn)小,說明這兩個點(diǎn)之間是有序的,不存在旋轉(zhuǎn)點(diǎn)。如果左邊的點(diǎn)比右邊的大,說明這兩個點(diǎn)之間有一個旋轉(zhuǎn)點(diǎn),導(dǎo)致了不再有序。因?yàn)橹挥幸粋€旋轉(zhuǎn)點(diǎn),所以一分為二后,肯定有一半是有序的。所以,我們還是可以用二分法,不過要先判斷左半邊有序還是右半邊有序。如果左半邊有序,則直接將目標(biāo)和左半邊的邊界比較,就知道目標(biāo)在不在左半邊了,如果不在左半邊肯定在右半邊。同理,如果右半邊有序,則直接將目標(biāo)和右半邊的邊界比較,就知道目標(biāo)在不在右半邊了,如果不在右半邊肯定在左半邊。這樣就完成了二分。

注意

這里要注意二分時候的邊界條件,一般來說我們要找某個確定的目標(biāo)時,邊界條件為:

min = 0, max = length - 1;
if(min <= max){
    min = mid + 1
    max = mid - 1
}

另外,判斷左半邊是否有序的條件是:nums[min] <= nums[mid],而判斷是否在某一個有序區(qū)間,則要包含那個區(qū)間較遠(yuǎn)的那一頭

代碼

迭代寫法

public class Solution {
    public int search(int[] nums, int target) {
        int min = 0, max = nums.length - 1, mid = 0;
        while(min <= max){
            mid = (min + max) / 2;
            if(nums[mid] == target){
                return mid;
            }
            // 如果左半部分是有序的
            if(nums[min] <= nums[mid]){
                if(nums[min] <= target && target < nums[mid]){
                    max = mid - 1;
                } else {
                    min = mid + 1;
                } 
            // 如果右半部份是有序的
            } else {
                if(nums[mid] < target && target <= nums[max]){
                    min = mid + 1; 
                } else {
                    max = mid - 1;
                }
            }
        }
        // 不滿足min <= max條件時,返回-1
        return -1;
    }
}

遞歸寫法

public class Solution {
    public int search(int[] nums, int target) {
        return helper(nums, 0, nums.length - 1, target);
    }
    
    public int helper(int[] nums, int min, int max, int target){
        int mid = min + (max - min) / 2;
        // 不滿足min <= max條件時,返回-1
        if(min > max){
            return -1;
        }
        if(nums[mid] == target){
            return mid;
        }
        // 如果左半部分是有序的
        if(nums[min] <= nums[mid]){
            // 如果在左半部分的邊界內(nèi)
            if(nums[min] <= target && target < nums[mid]){
                return helper(nums, min, mid - 1, target);
            // 如果不在左半部分的邊界內(nèi)
            } else {
                return helper(nums, mid + 1, max, target);
            }
        // 如果右半部份是有序的
        } else {
            // 如果在右半部分的邊界內(nèi)
            if(nums[mid] < target && target <= nums[max]){
                return helper(nums, mid + 1, max, target);
            // 如果不在右半部分的邊界內(nèi)
            } else {
                return helper(nums, min, mid - 1, target);
            }
        }
    }
}
Search in Rotated Sorted Array II
Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed?

Would this affect the run-time complexity? How and why?

Write a function to determine if a given target is in the array.

二分法 復(fù)雜度

時間 O(N) 空間 O(1)

思路

如果可能有重復(fù),那我們之前判斷左右部分是否有序的方法就失效了,因?yàn)榭赡苡羞@種13111情況,雖然起點(diǎn)小于等于中間,但不代表右邊就不是有序的,因?yàn)橹悬c(diǎn)也小于等于終點(diǎn),所有右邊也是有序的。所以,如果遇到這種中點(diǎn)和兩邊相同的情況,我們兩邊都要搜索。

代碼
public class Solution {
    public boolean search(int[] nums, int target) {
        return helper(nums, 0, nums.length - 1, target);
    }
    
    public boolean helper(int[] nums, int min, int max, int target){
        int mid = min + (max - min) / 2;
        // 不符合min <= max則返回假
        if(min > max){
            return false;
        }
        if(nums[mid] == target){
            return true;
        }
        boolean left = false, right = false;
        // 如果左邊是有序的
        if(nums[min] <= nums[mid]){
            // 看目標(biāo)是否在左邊有序數(shù)列中
            if(nums[min] <= target && target < nums[mid]){
                left = helper(nums, min, mid - 1, target);
            } else {
                left = helper(nums, mid + 1, max, target);
            }
        }
        // 如果右邊也是有序的
        if(nums[mid] <= nums[max]){
            // 看目標(biāo)是否在右邊有序數(shù)列中
            if(nums[mid] < target && target <= nums[max]){
                right = helper(nums, mid + 1, max, target);
            } else {
                right = helper(nums, min, mid - 1, target);
            }
        }
        // 左右兩邊有一個包含目標(biāo)就返回真
        return left || right;
    }
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64612.html

相關(guān)文章

  • leetcode 33 Search in Rotated Sorted Array

    摘要:如正常的升序排列應(yīng)該是,,,,,,旋轉(zhuǎn)過后可能就是,,,,,,。想法因?yàn)檫@是一個經(jīng)過旋轉(zhuǎn)的升序數(shù)組,我們可以將其看作兩個升序的序列,,,和,,。如果在前一個序列,則從前面進(jìn)行查找。如果在后面一個序列,則從最后一個元素開始查找。 題目詳情 Suppose an array sorted in ascending order is rotated at some pivot unknown...

    diabloneo 評論0 收藏0
  • leetcode33 search in rotated sorted array

    摘要:這里相比于思路一,更適用于目標(biāo)節(jié)點(diǎn)在中間的情況,而思路一在目標(biāo)節(jié)點(diǎn)分布在數(shù)組兩側(cè)會效率更高。 題目要求 Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 ...

    MkkHou 評論0 收藏0
  • [Leetcode] Find Minimum in Rotated Sorted Array 找旋

    摘要:二分迭代法復(fù)雜度時間空間遞歸??臻g思路找旋轉(zhuǎn)數(shù)組的起點(diǎn),實(shí)際上類似找一個山谷,只要兩邊都比中間高就對了,這和這題很像。 Find Minimum in Rotated Sorted Array I Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 ...

    notebin 評論0 收藏0
  • [LintCode/LeetCode] Search in Rotated Sorted Arra

    摘要:找中點(diǎn)若起點(diǎn)小于中點(diǎn),說明左半段沒有旋轉(zhuǎn),否則說明右半段沒有旋轉(zhuǎn)。在左右半段分別進(jìn)行二分法的操作。只判斷有無,就容易了。還是用二分法優(yōu)化 Search in Rotated Sorted Array Problem Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 ...

    U2FsdGVkX1x 評論0 收藏0
  • leetcode 81 Search in Rotated Sorted Array II

    摘要:題目要求相比于,中添加了數(shù)組中可能存在重復(fù)值的條件。這是我們可以將情況分為以下幾種。因?yàn)槿绻?,則左側(cè)或右側(cè)的子數(shù)組至少有一個為順序的數(shù)組,這違背題目要求。所喲一定是同理,如果,那么。 題目要求 Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand. ...

    Cheriselalala 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<