238.[LeetCode]Product of Array Except itself

来源:互联网 发布:淘宝延迟发货道歉信 编辑:程序博客网 时间:2024/06/07 06:29

内容关键:

  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 ———- 原序

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

0 0