Longest increasing subsequence: Difference between revisions
Content added Content deleted
(Added Julia language) |
(Add solution in Rust) |
||
Line 1,944: | Line 1,944: | ||
<pre>[2, 4, 5] |
<pre>[2, 4, 5] |
||
[0, 2, 6, 9, 11, 15]</pre> |
[0, 2, 6, 9, 11, 15]</pre> |
||
=={{header |Rust}}== |
|||
<lang Rust> fn lis(x: Vec<i32>)-> Vec<i32> { |
|||
let n = x.len(); |
|||
let mut m = vec![0; n]; |
|||
let mut p = vec![0; n]; |
|||
let mut l = 0; |
|||
for i in 0..n { |
|||
let mut lo = 1; |
|||
let mut hi = l; |
|||
while lo <= hi { |
|||
let mut mid = (lo + hi) / 2; |
|||
if x[m[mid]] <= x[i] { |
|||
lo = mid + 1; |
|||
} else { |
|||
hi = mid - 1; |
|||
} |
|||
} |
|||
let mut new_l = lo; |
|||
p[i] = m[new_l - 1]; |
|||
m[new_l] = i; |
|||
if new_l > l { |
|||
l = new_l; |
|||
} |
|||
} |
|||
let mut o = vec![0; l]; |
|||
let mut k = m[l]; |
|||
for i in (0..l).rev() { |
|||
o[i] = x[k]; |
|||
k = p[k]; |
|||
} |
|||
o |
|||
} |
|||
fn main() { |
|||
let v = vec![0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15]; |
|||
let o = lis(v); |
|||
println!("{:?}", o); |
|||
}</lang> |
|||
=={{header|Scala}}== |
=={{header|Scala}}== |