238.[LeetCode]Product of Array Except itself

桶排序与Java Hash实现
本文介绍了如何在O(n)时间复杂度内实现桶排序,适用于特定的数据分布情况。此外,还探讨了Java中不同Hash实现(如HashMap、TreeMap等)的遍历顺序,并给出了实测结果。

内容关键:

  1. 时间复杂度为 O(n) 的桶排序
  2. java中各类hash实现的遍历顺序

题中要求的时间复杂度不能超过 O(nlogn)

首先如果在O(nlogn)的时间复杂度能怎么做呢?

hash + 快排

但是如果要在 O(n) ,并且题中没有要求空间复杂度,那么我们就可以使用 桶排序

桶排序的特点

  1. 稳定的
  2. 最快
  3. 大量空间

算法的大量思路还是很简单的,先hash获取所有element出现的频率,然后遍历hash表,再存入对饮的桶中

public List<Integer> topKFrequent(int[] nums, int k) {

    List<Integer>[] bucket = new List[nums.length + 1];
    Map<Integer, Integer> frequencyMap = new HashMap<Integer, Integer>();

    for (int n : nums) {
        frequencyMap.put(n, frequencyMap.getOrDefault(n, 0) + 1);
    }

    for (int key : frequencyMap.keySet()) {
        int frequency = frequencyMap.get(key);
        if (bucket[frequency] == null) {
            bucket[frequency] = new ArrayList<>();
        }
        bucket[frequency].add(key);
    }

    List<Integer> res = new ArrayList<>();

    for (int pos = bucket.length - 1; pos >= 0 && res.size() < k; pos--) {
        if (bucket[pos] != null) {
            res.addAll(bucket[pos]);
        }
    }
    return res;
}

代码很好理解,并且容易通过,但是一个额外的问题却跑了出来,java中的hashmap 的 keyset 返回的值是有序的吗?其他hash的实现呢?

在这篇博文里,博主亲自示范了各种hash实现

不过,关于hashmap的部分是错误的,网上很多都说 hashmap 的 setkey 是 无序的,不过经过我亲自测试,最新的java中,应该是 升序的。

Hashtable ———————降序
TreeMap / HashMap ——升序
LinkedHashMap ———- 原序

有时候,与其各种找结果不如自己跑一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值