Example #1: [Leetcode] Count of Smaller Numbers After Self (315)
Solution: https://docs.google.com/document/d/1kfn4MfnLLXVNFfayX6L6sjAsZSuUy6gJoJit3sngG-E/edit?usp=sharing
Code:
class Solution {
public List<Integer> countSmaller(int[] nums) {
int[] tree = new int[nums.length + 1];
Map<Integer, Integer> rankMap = getRankMap(nums);
LinkedList<Integer> output = new LinkedList<>();
for (int i = nums.length - 1; i >= 0; i--) {
int rank = rankMap.get(nums[i]);
output.addFirst(sum(tree, rank));
add(tree, rank + 1, 1);
}
return output;
}
private Map<Integer, Integer> getRankMap(int[] nums) {
int[] sorted = Arrays.copyOf(nums, nums.length);
Arrays.sort(sorted);
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < sorted.length; i++) {
map.put(sorted[i], i);
}
return map;
}
private void add(int[] tree, int x, int val) {
for (int i = x; i < tree.length; i += lowbit(i)) {
tree[i] += val;
}
}
private int sum(int[] tree, int x) {
int output = 0;
for (int i = x; i > 0; i -= lowbit(i)) {
output += tree[i];
}
return output;
}
private int lowbit(int x) {
return x & (-x);
}
}
Notes:
- Sample input: [5,2,6,1,2,4,2,1]
- Sample output: [6,2,5,0,1,2,1,0]
- rankMap, {1=1, 2=4, 4=5, 5=6, 6=7}, is a kind of a data compression of the input because we only care about the relative partial order of the input.
References:
沒有留言:
張貼留言