给定2个数组的和分数-O(n)?

时间:2019-10-28 14:59:56

标签: time-complexity complexity-theory

您将获得2个int数组。

                    A=[1,   2,   1]
                    B=[2,   3,   3]

    so fractions are: 1/2, 2/3,  1/3

A是分子,B是分母。 所以分数是:1 / 2、2 / 3、1 / 3

找到总和为1的所有货币对。

示例:这里我们有2/3 + 1/3 = 1,所以计数= 1

返回1

因为输入可能很大,所以以10 ^ 9 +7为模返回

我在O(n ^ 2)中进行了一次处理,然后计算2的加法并检查它是否为1并更新计数器。

在O(n)中可能吗?

任何语言idm示例:

  function solution(integer array A, integer array B){
    return integer_counter;
  }

2 个答案:

答案 0 :(得分:0)

这是一个使用字典的 C# 解决方案

public static int SumOfFraction(int[] numerator, int[] denominator) {
  int count = 0;
  Dictionary < int, List < int >> keyValuePairs = new Dictionary < int, List < int >> ();

  for (int i = 0; i < denominator.Length; i++) {
    if (keyValuePairs.ContainsKey(denominator[i])) {
      keyValuePairs[denominator[i]].Add(numerator[i]);
    } else {
      keyValuePairs.Add(denominator[i], new List < int > {
        numerator[i]
      });
    }
  }

  foreach(var keypair in keyValuePairs) {
    if (keypair.Key == keypair.Value.Sum()) {
      count++;
    }
  }

  return count;
}

答案 1 :(得分:0)

Cpp 解决方案:

#include <cassert>
#include <cstdint>
#include <unordered_set>
#include <utility>
#include <vector>
#include <iostream>
using namespace std;

//From https://stackoverflow.com/questions/15160889/how-can-i-make-an-unordered-set-of-pairs-of-integers-in-c
struct IntPairHash {
  size_t operator()(const pair<uint32_t, uint32_t> &p) const {
    assert(sizeof(size_t)>=8);  //Ensure that std::size_t, the type of the hash, is large enough
    //Shift first integer over to make room for the second integer. The two are
    //then packed side by side.
    return (((uint64_t)p.first)<<32) | ((uint64_t)p.second);
  }
};


size_t 
countPairs(const vector<int>& v1, const vector<int>& v2) {
    unordered_set< std::pair<int, int>, IntPairHash> searchSet;
    size_t count = 0;
    for (size_t i = 0; i < v1.size(); i++) {
        int complement = v2[i] - v1[i];
        if (searchSet.find({complement, v2[i]}) != searchSet.end()) {
            count++;
        }
        searchSet.insert({v1[i], v2[i]});
    }
    return count;
}


int main() {
    cout << countPairs({1,2,1}, {2,3,3});
}

问题的一些说明:

  • 由于浮点错误,您不能像某些评论建议的那样存储除法的双精度值
  • 您不能将 pair<T1,T2> 直接存储在 unordered_set 中,因为它没有哈希函数。

所以我复制了一个我在 SO 中找到的哈希函数,然后我做了以下操作:

对于每对 v1v2,我计算了我应该找到哪个数字的总和为 1。如果我正在搜索的值已经在 searchSet 中,我可以在柜台上加一个。最后,我将 v1[i], v2[i] 值添加到 searchSet。

for 循环是 O(n),对 unordered_set 的每次插入/检查操作都是 O(1)