Each operation removes a strictly increasing subsequence. The minimum number of such operations equals the length of the longest decreasing subsequence (LDS), by Dilworth’s theorem.
import java.util.*;
classSolution {
publicintminOperations(int[] nums) {
List<Integer> piles =new ArrayList<>();
for (int i = nums.length-1; i >= 0; --i) {
int x = nums[i];
int j = Collections.binarySearch(piles, x);
if (j < 0) j =-j-1;
if (j == piles.size()) piles.add(x);
else piles.set(j, x);
}
return piles.size();
}
}
1
2
3
4
5
6
7
8
9
10
11
classSolution {
funminOperations(nums: IntArray): Int {
val piles = mutableListOf<Int>()
for (i in nums.indices.reversed()) {
val x = nums[i]
val j = piles.binarySearch(x).let { if (it < 0) -it-1elseit }
if (j == piles.size) piles.add(x) else piles[j] = x
}
return piles.size
}
}
1
2
3
4
5
6
7
8
9
10
11
import bisect
classSolution:
defminOperations(self, nums: list[int]) -> int:
piles = []
for x in reversed(nums):
i = bisect.bisect_left(piles, x)
if i == len(piles):
piles.append(x)
else:
piles[i] = x
return len(piles)