【问题标题】:LeetCode Question: Improve Execution Time w/o Hash?LeetCode 问题:在没有哈希的情况下提高执行时间?
【发布时间】:2020-09-16 17:42:42
【问题描述】:

我的解决方案是找出一个整数是否在数组中重复,虽然正确,但由于超出了 LeetCode 预期的时间限制而被拒绝。我知道嵌套 for 循环是 O(n^2) 的罪魁祸首。有没有办法在不使用哈希的情况下以任何有意义的方式减少这种情况?

bool containsDuplicate(int* nums, int numsSize){
    
    bool result = 0;
    
    for( int i = 0; i < numsSize; i++)
    {
        for ( int j = 1; j < (numsSize - i); j++)
        {
            if(nums[i] == nums[i + j])
            {
                result = 1;
            }
        }
    }
    return result;
}

【问题讨论】:

  • 你可以对数组进行排序,看看是否有两个连续的值相同。它将解决 O(nlogn) 中的问题
  • 使用一个Set,每次检查元素是否已经插入(O(1)),如果没有,插入它,否则你有一个重复,所以每次迭代你做一个O(1 ) 操作,并且您最多会执行 n 次,因此您最终会得到一个 O(n) 解决方案(但您最多会消耗 O(n) 内存,但这里似乎不是问题)
  • 数组中有多少项?
  • @DeepakPatankar 对整个数组进行排序以找到重复项?..
  • 我建议一个不使用哈希的解决方案。是的,它不是一个有效的。

标签: c++ arrays algorithm data-structures


【解决方案1】:

leetcode problem specifies 不超过 30001 个数值在 2 到 30000 之间的数字;只有一个号码会重复一次或多次。我们可以将一个 30001 大小的 unsigned char 数组初始化为零,然后在检查每个数组时将数组 val 设置为 1。此外,我们会检查我们是否已经看到它(将其设置为 1),如果我们已经看到,则保释:

int containsDuplicate(int* nums, int numsSize){
  int result = 0;
  unsigned char seenmap[30001] = {0};
  for( int i = 0; i < numsSize; i++)
  {
     if( seenmap[ nums[i] ] == 1 )
     {
       result = nums[i];
       break;
     } 
     seenmap[ nums[i] ] = 1;
  }
  return result;
}

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-16
    • 1970-01-01
    • 2017-08-31
    • 1970-01-01
    相关资源
    最近更新 更多