Count of Smaller Numbers After Self

Yeshwanth Chintaginjala
1 min readJul 25, 2022

class Solution {
class SegmentTreeNode{
int start,end,sum;
SegmentTreeNode left,right;
SegmentTreeNode(int start,int end){
this.start = start;
this.end = end;
}
}

public SegmentTreeNode constructSegmentTree(int start,int end){

if(start>end){
return null;
}
SegmentTreeNode node = new SegmentTreeNode(start,end);
if(start == end){
return node;
}
int mid = start + (end-start)/2;
node.left = constructSegmentTree(start,mid);
node.right = constructSegmentTree(mid+1,end);
return node;
}
public void update(SegmentTreeNode node,int index){
if(node == null){
return;
}
if(node.start == index && node.end == index){
node.sum+=1;
return;
}
int mid = node.start+(node.end-node.start)/2;
if(index<=mid){
update(node.left,index);
}
else{
update(node.right,index);
}
node.sum = node.left.sum + node.right.sum;
}

public int getSumRange(SegmentTreeNode node,int start,int end){

if(node == null || start>end){
return 0;
}
if(node.start == start && node.end == end){
return node.sum;
}
int mid = node.start + (node.end-node.start)/2;
if(end<=mid){
return getSumRange(node.left,start,end);
}
else if(start>mid){
return getSumRange(node.right,start,end);
}
else{
return getSumRange(node.left,start,mid) +
getSumRange(node.right,mid+1,end);
}

}
public List<Integer> countSmaller(int[] nums) {
List<Integer>result = new ArrayList<>();
if(nums == null || nums.length == 0){
return Collections.<Integer>emptyList();
}
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++){
min = Math.min(min,nums[i]);
max = Math.max(max,nums[i]);
}
SegmentTreeNode root = constructSegmentTree(min,max);
int []count = new int[nums.length];
for(int i=nums.length-1;i>=0;i — )
{
update(root,nums[i]);
count[i] = getSumRange(root,min,nums[i]-1);
}
return Arrays.stream(count).boxed().collect(
Collectors.toList());
}
}

--

--