581. 最短無序連續(xù)子數(shù)組(Python)

題目

難度:★★☆☆☆
類型:數(shù)組

給定一個整數(shù)數(shù)組蚯姆,你需要尋找一個連續(xù)的子數(shù)組沧侥,如果對這個子數(shù)組進行升序排序瞎疼,那么整個數(shù)組都會變?yōu)樯蚺判颉?/p>

你找到的子數(shù)組應是最短的,請輸出它的長度割卖。

說明
輸入的數(shù)組長度范圍在 [1, 10,000]前酿。
輸入的數(shù)組可能包含重復元素 ,所以升序的意思是<=究珊。

示例

示例 1:
輸入: [2, 6, 4, 8, 10, 9, 15]
輸出: 5
解釋: 你只需要對 [6, 4, 8, 10, 9] 進行升序排序薪者,那么整個表都會變?yōu)樯蚺判颉?/p>

解答

為了尋找需要排序的子串的最小長度,我們可以逆向思維剿涮,先將數(shù)組排序,然后從兩端向中間比較攻人,查看從哪個位置開始不一樣取试。

  1. 先將輸入數(shù)組排序,有必要判斷排序后的數(shù)組是否和原數(shù)組相同怀吻,如果相同說明無需排序任何子數(shù)組瞬浓,直接返回零即可;

  2. 定義左指針蓬坡,從零開始向右滑動猿棉,并逐一比較原數(shù)組和排序后數(shù)組在該指針處的值,遇到不同值時相當于遇到了需要排序的子數(shù)組的最左端屑咳,記錄下該位置并停止滑動萨赁;同樣的,定義從右向左滑動的右指針兆龙,記錄第一次出現(xiàn)不同的位置杖爽;

  3. 通過左右指針的位置即可計算出需要排序的最短無序子數(shù)組的長度,這里注意需要對結(jié)果進行+1即可紫皇。

class Solution:
    def findUnsortedSubarray(self, nums):
        sorted_nums = sorted(nums)                  # 排序后的結(jié)果

        if sorted_nums == nums:                     # 如果輸入本來就有序
            return 0                                # 不需要排序任何元素

        left = 0                                    # 初始化左指針
        while True:
            if nums[left] != sorted_nums[left]:     # 遇到了第一個不同元素
                break                               # 跳出循環(huán)
            left += 1                               # 左指針右移

        right = len(nums) - 1                       # 初始化右指針
        while True:
            if nums[right] != sorted_nums[right]:   # 遇到了第一個不同元素
                break                               # 跳出循環(huán)
            right -= 1                              # 右指針左移

        return right - left + 1                     # 返回需要調(diào)整的子串長度

下面是一個上述方法的一個緊湊寫法:

class Solution:
    def findUnsortedSubarray(self, nums):
        # 記錄下原數(shù)組和排序后數(shù)組相應元素不同的所有位置慰安,并組成列表
        diff = [i for i, (a, b) in enumerate(zip(nums, sorted(nums))) if a != b]
        # 如果有不同元素,返回不同元素的最右端位置和最左端位置之差聪铺,否則返回零
        return len(diff) and max(diff) - min(diff) + 1

如有疑問或建議化焕,歡迎評論區(qū)留言~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市铃剔,隨后出現(xiàn)的幾起案子撒桨,更是在濱河造成了極大的恐慌脂倦,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件元莫,死亡現(xiàn)場離奇詭異赖阻,居然都是意外死亡,警方通過查閱死者的電腦和手機踱蠢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門火欧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人茎截,你說我怎么就攤上這事苇侵。” “怎么了企锌?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵榆浓,是天一觀的道長。 經(jīng)常有香客問我撕攒,道長陡鹃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任抖坪,我火速辦了婚禮萍鲸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘擦俐。我一直安慰自己脊阴,他們只是感情好,可當我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布蚯瞧。 她就那樣靜靜地躺著嘿期,像睡著了一般。 火紅的嫁衣襯著肌膚如雪埋合。 梳的紋絲不亂的頭發(fā)上备徐,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天,我揣著相機與錄音饥悴,去河邊找鬼坦喘。 笑死,一個胖子當著我的面吹牛西设,可吹牛的內(nèi)容都是我干的瓣铣。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼贷揽,長吁一口氣:“原來是場噩夢啊……” “哼棠笑!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起禽绪,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤蓖救,失蹤者是張志新(化名)和其女友劉穎洪规,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體循捺,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡斩例,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了从橘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片念赶。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖恰力,靈堂內(nèi)的尸體忽然破棺而出叉谜,到底是詐尸還是另有隱情,我是刑警寧澤踩萎,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布停局,位于F島的核電站,受9級特大地震影響香府,放射性物質(zhì)發(fā)生泄漏董栽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一回还、第九天 我趴在偏房一處隱蔽的房頂上張望裆泳。 院中可真熱鬧,春花似錦柠硕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至民泵,卻和暖如春癣丧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背栈妆。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工胁编, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鳞尔。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓嬉橙,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,982評論 2 361