zoukankan      html  css  js  c++  java
  • 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难度的题。

  • 相关阅读:
    Action常见注解的运用
    发现越来越喜欢来博客园了,所以自己也注册了一个!
    jsf 繁体教程下载pdf
    poj3210
    poj3224
    poj3219
    poj3233
    poj3372
    Paper Pal:一个中英文论文及其代码大数据搜索平台
    年轻就该多尝试,教你20小时Get一项新技能
  • 原文地址:https://www.cnblogs.com/reboot329/p/11372126.html
Copyright © 2011-2022 走看看