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

标签 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]

最佳答案

您的问题被称为 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)

如果您关心性能,可能可以优化为使用 transient

关于clojure - 如何过滤递增向量中递减的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32165255/

相关文章:

Clojure 评估惰性序列

clojure - 使用 reduce 避免 clojure 中的 StackOverflowError

clojure - 将嵌套映射列表转换为映射的替代方法

java - Java 的 toString() 对 Clojure 函数的等价物

java - 最快的高斯模糊实现

python - 如何创建具有周数范围的系列?

python - Pandas 数据框 - 使用一条记录创建数据框

c# - LINQ 中的循环移动平均滤波器

python - 20hz-20000hz巴特沃斯滤波爆炸式

javascript - 折线图系列向下钻取到另一个折线图系列