leetcode 75.ソート色の色分類トリコロール/オランダの旗問題の高速ロウアイデア

leetcode 75.ソート色の色分類トリコロール/オランダの旗問題の高速ロウアイデア


AC電源はインタビューで表現することができるアイデアがあり、バックルブラシとACにではなく、それぞれの質問をかみます。もちろん、いくつかのエンジニア貴アイデアは、コンピュータアルゴリズムの分野、拍手の原因を調査するために、アルゴリズム的思考にあります!

トピック:

、赤、白、青、合計n個の配列の要素、in situでそれらをソートし、同じ色を持つように隣接する素子と、赤、白、青の順に配置所与。この問題は、我々は、赤、白、青を表す0、1、2の整数を使用します。

注:あなたがこの質問を解決するためのソート機能のコードベースを使用することはできません。

例:
入力:[2,0,2,1,1,0]
出力:[0,0,1,1,2,2]
高度:簡単な解決策は、アルゴリズムの数が二倍にソートスキャンを使用することです。
まず、要素0、1、2、及びその後の数の反復計算は、現在のアレイを上書き、0,1,2ソート。あなただけの一定のスペースアルゴリズムを使用しない単一のパスを考えることができますか?

アイデア: トリコロール/オランダフラグの問題、高速の行を考えて:左が0に残っていることを確認するために、右右2です。行は、彼のために良いされている右ので、左から右にトラバースkは、権利です。NUMS [k]は全く移動を必要としない、それが中心であることを、1であれば、ために配置されたK + 1を続け; NUMS [k]が0である場合、1 +左左列は、左列が完成され、K + 1次のページを示して下の行、右1 NUMS [k]が2の場合、右側の列は、上右の行を示しているが、不明サイズの数が再び、kは不変ので、放電位置ことは、この位置で転送されます。再びそれをスキャンします。

詳細:

  1. ピット:kはトラバースに右よりも小さいです
  2. ピット:左のニーズ+ 1は、右の1を必要としません。
  3. リスト要素パイソン交換位置:リスト[i]は、リスト[J] =リスト[J]、リスト[I]

コード:

class Solution(object):
    def sortColors(self, nums):
        """
        :type nums: List[int]
        :rtype: None Do not return anything, modify nums in-place instead.
        """
        left=0
        right=len(nums)-1
        k=0
        #保证left左面都是0,right右面都是2
        while k<=right: #right右边的是已经排完的了
            if nums[k]==1: #如果是1,就是中部的,不需要动,k+1继续排下一个
                k+=1
            elif nums[k]==0: #如果是0,排在左边,left+1证明左边的都排完了,k+1接着排下一个
                nums[left],nums[k]=nums[k],nums[left]
                left+=1
                k+=1
            else: #如果是2,排在右边,right-1证明右边的都排完了,但是不确定调到这个位置的数的大小,所以要再排该位置的
                nums[right],nums[k]=nums[k],nums[right]
                right-=1

このブログは、ソースを示し、この記事へのリンクを添付してください、指導を歓迎再現し、オリジナル作品です、ありがとうございました!

公開された20元の記事 ウォンの賞賛1 ビュー192

おすすめ

転載: blog.csdn.net/weixin_43973433/article/details/104992547