Clojure 如何过滤递增向量中的递减元素?
比如说Clojure 如何过滤递增向量中的递减元素?,clojure,filtering,series,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] 您的问题称为问题 通过: (defn位置[桩卡] (让[[les gts](>>桩(与#(>les last first分开)) modpile(cons newe
[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]
您的问题称为问题 通过:
(defn位置[桩卡]
(让[[les gts](>>桩(与#(>les last first分开))
modpile(cons newelem(第一gts))]
(混凝土桩(剩余gts()()))
(定义a-最长[卡片]
(让[桩(减少位置“()卡片)]
(>>桩最后一个倒转)
(a-最长[12343031324129])
;; => (1 2 3 30 31 32 41)
如果您关心性能,可能会优化使用
瞬变。最简单的解决方案:生成所有必须跳过的位置的所有置换,然后检查它是否保持所需的属性,然后选择最长的。在这种情况下,置换的数量显然是2^N
,而整个过程中只有512个[1 2 3 40 30 31 32 41 29]< /代码>一个蛮力的方法在这里是行不通的,因为我的系列是由几百个元素组成的。我可以考虑启发法。然后,乍一看,可以使用动态编程的方法。我不理解第一个输出示例。如果你只删除<代码> 40 <代码>,你就有一个比你大的严格递增的向量。范例。@Andre你说得对,很抱歉输入错误。非常感谢!这正是我要找的
(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)