315. Count of Smaller Numbers After Self


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难度的题。

posted @ 2019-08-18 13:21  哇呀呀..生气啦~  阅读(201)  评论(0编辑  收藏  举报