刷
Aug-17-2019
这个题还是蛮好的,看提示是区间题,包括binary index tree和segment tree。前者早JB忘了怎么做了,后者想了一会也没想出来= =
第一个做法是从后开始拿元素,然后往新的list里面放,保持新的list是sorted,放进去的位置就是当前比它小的元素的数量。放的时候用二分,怎么二分动脑子想想,yes left no right.
class Solution {
public List<Integer> countSmaller(int[] nums) {
List<Integer> res = new ArrayList<>();
if (nums == null || nums.length == 0) {
return res;
}
List<Integer> tempList = new ArrayList<>();
for (int i = nums.length-1; i >= 0; i --) {
int tempI = getI(nums[i], tempList);
res.add(tempI);
}
Collections.reverse(res);
return res;
}
private int getI(int val, List<Integer> list) {
int l = 0, r = list.size()-1;
while (l <= r) {
int m = l + (r - l) / 2;
if (list.get(m) < val) {
l = m + 1;
} else {
r = m - 1;
}
}
if (l == list.size()) {
list.add(val);
return list.size()-1;
} else {
list.add(l, val);
return l;
}
}
}
第二个做法是把二分换成做树,一个一个加,往左就当前NODE+1,这样,
看别人的答案还可以用fenwick tree,我实在是忘了怎么做了。。
光记得找左找右是
i += (i & -i)
i -= (i&-i)
所以干脆不做了= =
具体看这题知道从后开始算以达到新算的不影响已算结果,用上面的二分也就是个M难度的题。