日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法:荷兰国旗问题

發布時間:2024/8/1 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法:荷兰国旗问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是荷蘭國旗問題

荷蘭國旗是由紅白藍3種顏色的條紋拼接而成,如下圖所示:

假設這樣的條紋有多條,且各種顏色的數量不一,并且隨機組成了一個新的圖形,新的圖形可能如下圖所示,但是絕非只有這一種情況:

需求是:把這些條紋按照顏色排好,紅色的在上半部分,白色的在中間部分,藍色的在下半部分,我們把這類問題稱作荷蘭國旗問題。

我們把荷蘭國旗問題用數組的形式表達一下是這樣的:

給定一個整數數組,給定一個值K,這個值在原數組中一定存在,要求把數組中小于K的元素放到數組的左邊,大于K的元素放到數組的右邊,等于K的元素放到數組的中間,最終返回一個整數數組,其中只有兩個值,分別是等于K的數組部分的左右兩個下標值。

例如,給定數組:[2, 3, 1, 9, 7, 6, 1, 4, 5],給定一個值4,那么經過處理原數組可能得一種情況是:[2, 3, 1, 1, 4, 9, 7, 6, 5],需要注意的是,小于4的部分不需要有序,大于4的部分也不需要有序,返回等于4部分的左右兩個下標,即[4, 4]

實現

思路

我們以上面舉的例子來看看處理過程的圖示:

  • less 用于記錄小于 4 的區域的右下標,初始為-1,表示不存在小于4的
  • more 用于記錄大于 4 區域的左下標,初始為9,表示不存在大于4的
  • L 用于正在遍歷的元素的下標,初始值為0
    從 arr[L] 即 arr[0] 開始遍歷數組
    • 如果 arr[L] < 4, 交換 arr[++ less] 和 arr[L++] 的值
      • ++less:小于4的元素增加一個,L就是最右邊的索引
      • L++:將正在遍歷的那個元素放置到[小于4區間的最右邊],然后接著進行下一輪比較
    • 如果 arr[L] > 4, 交換 arr[–more] 和 arr[L] 的值
      • –more:大于4的最左邊的那個元素的索引
      • L不變是因為下一輪還要比較交換過來的元素, L++
    • 如果 arr[L] = 4, 不交換,L++,直接遍歷下一個值
    • 當 L >= more,退出循環。

std::vector<int> partition(std::vector<int> &arr, int L, int R, int priv){int less = L - 1;int more = R + 1;int curr = L; // 就是上圖的L,當然也可以寫成下面那樣while (curr < more){if(arr[curr] < priv){std::swap(arr[curr++], arr[++less]);}else if(arr[curr] > priv){std::swap(arr[curr] , arr[--more]);}else{curr++;}}return { less + 1, more - 1 }; // 和p相等的邊界 } std::vector<int> partition(std::vector<int> &arr, int L, int R, int priv){int less = L - 1;int more = R + 1;while (L < more){if(arr[L] < priv){std::swap(arr[L++], arr[++less]);}else if(arr[L] > priv){std::swap(arr[L] , arr[--more]);}else{L++;}}return { less + 1, more - 1 }; // 和p相等的邊界 }

參考

總結

以上是生活随笔為你收集整理的算法:荷兰国旗问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。