Count of Smaller Numbers After Self

来源:互联网 发布:计算机自动编程 编辑:程序博客网 时间:2024/06/06 11:46

首先吐槽下CSDN,写完,发表,直接没了,辛苦写的东西就这么不见了……

You are given an integer array nums and you have to return a new counts array. Thecounts array has the property where counts[i] is the number of smaller elements to the right of nums[i].

Example:

Given nums = [5, 2, 6, 1]To the right of 5 there are 2 smaller elements (2 and 1).To the right of 2 there is only 1 smaller element (1).To the right of 6 there is 1 smaller element (1).To the right of 1 there is 0 smaller element.

Return the array [2, 1, 1, 0].

这道题目的意思就是输入数组nums,输出数组arr,其中arr[i]的值是数组nums中位于nums[i]右侧且小于nums[i]的元素是数目,如果暴力搜索的话,时间复杂度大概为O(n^2),太高了。题目是比较位于右侧的元素,因此我们逆序遍历数组nums,并把大小信息用二叉查找树存储起来。在构造二叉查找树的时候,为每个二叉查找树节点增加一个属性用于记录子树节点数目,便于后续统计符合要求的元素数目。同时,需要考虑数组中值相同的元素,由于统计的是小于目标的元素数目,因此把相等的值也插入节点的右子树中。代码如下:

class BinarySearchTreeNode{BinarySearchTreeNode leftChildren;BinarySearchTreeNode rightChildren;int value;int num;public BinarySearchTreeNode(int v){this.value = v;num = 1;}}public int insert(int v, BinarySearchTreeNode node){int re = 0;while(true){if(v < node.value){node.num ++;if(node.leftChildren == null){node.leftChildren = new BinarySearchTreeNode(v);break;}node = node.leftChildren;}else{node.num ++;// v >= node.value,加上左子树以及node本身re += getNum(node.leftChildren);if(node.value != v)re++;if(node.rightChildren == null){node.rightChildren = new BinarySearchTreeNode(v);break;}node = node.rightChildren;}}return re;}private int getNum(BinarySearchTreeNode node){if(node == null)return 0;elsereturn node.num;}public List<Integer> countSmaller(int[] nums) {        LinkedList<Integer> reList = new LinkedList<Integer>();        if(nums == null || nums.length == 0)        return reList;        reList.addFirst(0);        BinarySearchTreeNode root = new BinarySearchTreeNode(nums[nums.length-1]);        for(int i=nums.length-2; i >= 0; i--){        int el = nums[i];        int re = insert(el,root);        reList.addFirst(re);        }                return reList;}


0 0