如何过滤递增向量中的递减元素?

时间:2015-08-23 09:42:52

标签: clojure filtering series

例如

[1 2 3 40 7 30 31 32 41]
过滤后

[1 2 3 30 31 32 41]

这个问题看起来并不简单,因为我想最大化结果向量的大小,这样如果起始向量是

[1 2 3 40 30 31 32 41 29]

我更喜欢这个结果

[1 2 3 30 31 32 41]

而不仅仅是

[1 2 3 29]

1 个答案:

答案 0 :(得分:2)

您的问题称为longest increasing subsequence

通过rosetta code

(defn place [piles card]
  (let [[les gts] (->> piles (split-with #(<= (ffirst %) card)))
        newelem (cons card (->> les last first))
        modpile (cons newelem (first gts))]
    (concat les (cons modpile (rest gts)))))

(defn a-longest [cards]
  (let [piles (reduce place '() cards)]
    (->> piles last first reverse)))

(a-longest [1 2 3 40 30 31 32 41 29])
;; => (1 2 3 30 31 32 41)

如果您关心效果,可能会优化使用transients