given an array, for each element, find out the total number of elements lesser than it, which appear to the right of it

后端 未结 10 1799
傲寒
傲寒 2021-02-04 11:43

I had previously posted a question, Given an array, find out the next smaller element for each element now, i was trying to know , if there is any way to find out \"given an ar

10条回答
  •  闹比i
    闹比i (楼主)
    2021-02-04 11:56

    You can also use an array instead of a binary search tree.

    def count_next_smaller_elements(xs):
        # prepare list "ys" containing item's numeric order
        ys = sorted((x,i) for i,x in enumerate(xs))
        zs = [0] * len(ys)
    
        for i in range(1, len(ys)):
            zs[ys[i][1]] = zs[ys[i-1][1]]
            if ys[i][0] != ys[i-1][0]: zs[ys[i][1]] += 1
    
        # use list "ts" as binary search tree, every element keeps count of
        # number of children with value less than the current element's value
        ts = [0] * (zs[ys[-1][1]]+1)
        us = [0] * len(xs)
    
        for i in range(len(xs)-1,-1,-1):
            x = zs[i]+1
            while True:
                us[i] += ts[x-1]
                x -= (x & (-x))
                if x <= 0: break
    
            x = zs[i]+1
            while True:
                x += (x & (-x))
                if x > len(ts): break
                ts[x-1] += 1
    
        return us
    
    print count_next_smaller_elements([40, 20, 10, 50, 20, 40, 30])
    # outputs: [4, 1, 0, 2, 0, 1, 0]
    

提交回复
热议问题