【问题标题】:Find single integer using Hashmap使用 Hashmap 查找单个整数
【发布时间】:2015-03-02 06:47:58
【问题描述】:

一个编码问题:Given an array of integers, every element appears twice except for one. Find that single one. 它需要a linear runtime complexity

我的解决方案:

public class Solution {
    public int singleNumber(int[] A) {
    HashMap<Integer, Integer> lut = new HashMap<Integer, Integer>();
     for (int i=0; i<A.length; i++){
         if(lut.containsKey(A[i])){
             lut.remove(A[i]);
         }
         else{
             lut.put(A[i],1);
         }
     }

     Set<Integer> keys = lut.keySet();
     System.out.println(keys.size());
     for(Integer integer: keys)
         return integer;

     return (Integer) null;
 }

}

我认为复杂性是O(n),因为它只通过数组一次,HashMap 使用固定时间获取元素。但在网上判断后,它说我的代码time limit。有人能指出为什么这超过了时间限制吗?如何改进?

【问题讨论】:

  • 您的代码具有线性时间复杂度。
  • 鉴于您只关心密钥集,我个人会使用HashSet&lt;Integer&gt; 以使代码清晰。但是,是的,假设没有哈希桶冲突,这应该具有线性复杂性。话虽如此,有一个简单的解决方案,占用空间非常小。

标签: java arrays hashmap


【解决方案1】:

我怀疑时间限制是在考虑特定实现的情况下设置的。您的解决方案对我来说应该是线性时间 - 但它可能是比这段代码大得多的常数因子:

public int findSingleNumber(int[] array) {
    int result = 0;
    for (int item : array) {
        result ^= item;
    }
    return result;
}

这使用了这样一个事实,即除了我们想要的项目之外的所有项目都恰好出现两次,因此如果将它们异或在一起,它们将相互抵消。我们只剩下我们正在寻找的号码。

我要补充一点,像这样的谜题很有趣,而且可以扩展思维 - 但解决方案很少是你想在实际应用程序中使用的。

【讨论】:

  • 嗨,这是最好的解决方案。我只是好奇为什么leetcode网站不能接受我的回答...
  • @Liquid:嗯,我建议他们可能有一个非常小的超时......这需要解决方案不仅是 O(n),而且还有一个小的常数因子。
猜你喜欢
  • 1970-01-01
  • 2017-06-18
  • 2020-04-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多