Anonymous user
Longest increasing subsequence: Difference between revisions
→{{header|C++}}
(→Python: Patience sorting method: use python slice technique (x[i:i+k] = [...]) to simplify if-else case for replace/append new node) |
|||
Line 422:
=={{header|C++}}==
Patience sorting
<lang cpp>#include <
#include <
#include <algorithm>
#include <
template <typename
struct Node {
Node* prev_node;
};
template <
Container lis(const Container& values) {
using E = typename Container::value_type;
using ConstNodePtr = const NodePtr;
}▼
};▼
std::vector<NodePtr> pileTops;▼
std::vector<Node<E>> nodes(values.size());
// sort into piles▼
template <typename E>▼
auto cur_node = std::begin(nodes);
for (auto cur_value = std::begin(values); cur_value != std::end(values); ++cur_value, ++cur_node)
{
auto node = &*cur_node;
// lower_bound returns the first element that is not less than 'node->value'
▲ std::vector<NodePtr> pileTops;
▲ // sort into piles
[](ConstNodePtr& node1, ConstNodePtr& node2) -> bool { return node1->value < node2->value; });
▲ NodePtr node(new Node<E>());
if (lb != pileTops.begin())
▲ node->value = *it;
node->prev_node = *std::prev(lb);
▲ std::lower_bound(pileTops.begin(), pileTops.end(), node, node_ptr_less<E>());
if (
*
// extract LIS from piles
//
auto r = std::rbegin(result);
for (NodePtr node = pileTops.back(); node != NULL; node = node->pointer)▼
result.push_back(node->value);▼
return result;▼
▲ return result;
}
int main() {▼
void show_lis(const Container& values)
{
for (auto& r : result) {
std::cout <<
▲ }
std::cout << std::endl;▼
int arr2[] = {0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15};▼
{
show_lis(std::
▲ std::cout << std::endl;
}</lang>
{{out}}
<pre>2
0
=={{header|Clojure}}==
|