例如
[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]
答案 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
。