【Lintcode】1297. Count of Smaller Numbers After Self

本文介绍了一种使用树状数组解决特定数组问题的方法。给定一个数组,目标是创建一个新数组,其中每个元素表示右侧比当前元素小的数字数量。通过构建树状数组并逆向遍历原始数组,可以高效地计算这一数量,实现时间复杂度为O(nlog(max-min))。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目地址:

https://www.lintcode.com/problem/count-of-smaller-numbers-after-self/description

给定一个长 n n n数组 A A A,要求返回一个数组 B B B使得 B [ i ] B[i] B[i]等于 A [ i ] A[i] A[i]右边且比 A [ i ] A[i] A[i]小的数字个数。

可以用树状数组。做法可以参考:https://blog.youkuaiyun.com/qq_46105170/article/details/108429714。代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Solution {
    
    class FenwickTree {
        private int[] tree;
        private int n;
        
        public FenwickTree(int n) {
            tree = new int[n + 1];
        }
        
        public int query(int i) {
            int res = 0;
            while (i > 0) {
                res += tree[i];
                i -= lowbit(i);
            }
            
            return res;
        }
        
        public void add(int i, int x) {
            while (i < tree.length) {
                tree[i] += x;
                i += lowbit(i);
            }
        }
        
        private int lowbit(int x) {
            return x & -x;
        }
    }
    
    /**
     * @param nums: a list of integers
     * @return: return a list of integers
     */
    public List<Integer> countSmaller(int[] nums) {
        // write your code here
        int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
        for (int num : nums) {
            max = Math.max(max, num);
            min = Math.min(min, num);
        }
        
        FenwickTree tree = new FenwickTree(max - min + 1);
        List<Integer> res = new ArrayList<>();
        
        for (int i = nums.length - 1; i >= 0; i--) {
            tree.add(nums[i] - min + 1, 1);
            res.add(tree.query(nums[i] - min));
        }
    
        Collections.reverse(res);
        return res;
    }
}

时间复杂度 O ( n log ⁡ ( m a x − m i n ) ) O(n\log (max-min)) O(nlog(maxmin)),空间 O ( m a x − m i n ) O(max-min) O(maxmin)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值