Number of tuples
Number of tuples
我获得了n个数字a [1..n]和2个其他整数L和H。我如何计算满足i&lt的元组(i,j,k)的数量(i,j,k);J<k和l< = a [i] a [j] a [k]< = h。
1 <= T <= 100
1 <= N <= 1000
1 <= L <= H <= 1000000
1 <= a[i] <= 1000000
ps:需要比N2Logn更好的解决方案
解决方案
由于我的c/c 有些生锈,这主要是一个算法问题,所以我将在伪代码中写(主要是正确的c/c ,带有一些算法,这需要一段时间才能写出)。
) )。如果您至少具有sizeof(int) * 10^12个字节的内存和时间,则可以使用此算法与时间复杂性o(n^2 * log(n))。
// Sort the N numbers using your favorite, efficient sorting method. (Quicksort, mergesort, etc.) [O(n*log(n))].
int[] b = sort(a)
int[] c = int[length(b)^2];
// Compute the sums of all of the numbers (O(n^2))
for(int i = 0; i < length(b); i++){
for (int j = i; j < length(b); j++){
c[i*length(b)+j] = b[i]+b[j];
}
}
// Sort the sum list (you can do the sorts in-place if you are comfortable) - O(n^2*log(n))
d = sort(c);
// For each number in your list, grab the list of of sums so that L<=num+sum<=H O(n)
// Use binary search to find the lower, upper bounds O(log(n))
// (Total complexity for this part: O(n*log(n))
int total = 0;
for (int i = 0; i < b; i++){
int min_index = binary_search(L-b[i]); // search for largest number <= L-b[i]
int max_index = binary_search(H-b[i]); // search for smallest number >= H-b[i]
total += max_index - min_index + 1; // NOTE: This does not handle edge cases like not finding any sums that work
}
return total;
基本方法:
for (i=0; i<N; i++) {
for (j=i+1; j<N; j++) {
for (k=j+1; k<N; k++) {
int sum = a[i] + a[j] + a[k];
if (L <= sum && sum <= H) number_of_tuples++;
}
}
}
可能更好(可能有一个错误,但基本思想是如果您已经超过最大值,则打破):
for (i=0; i<N; i++) {
if (a[i] > H) continue;
for (j=i+1; j<N; j++) {
if (a[i] + a[j] > H) continue;
for (k=j+1; k<N; k++) {
int sum = a[i] + a[j] + a[k];
if (L <= sum && sum <= H) number_of_tuples++;
}
}
}
int find_three(int arr[], int c, int l,int h)
{
int i, j, e, s, k;
int count =0;
sort(arr,arr+c);
c--;
while(arr[c]>h)
c--;
int sum=0;
for (int i = 0; i<=c-2;i++)
{ sum=arr[i]+arr[i+1]+arr[i+2];
if(sum>h)
break;
for(j=i+1;j<=c-1;j++)
{
for(k=j+1;k<=c;k++)
{ sum=arr[i]+arr[j]+arr[k];
if(sum>=l &&sum<=h)
count++;
if(sum>h)
break;
}
if(sum>h)
break;
}
}
return count;
}
相关文章:
- Usages of std::move
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- 具有变量Number of Arguments的std::函数的矢量
- Capacity of a deque
- Deprecation of _writeBarrier()
- constexpr begin of a std::array
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- C++ "error: invalid use of void expression"
- 我看到"use of undeclared identifier"错误,有人可以告诉我如何解决它吗?
- 赛通"Cannot take address of memoryview slice"
- C++ Version Of Double.longBitsToDouble
- 收到错误"invalid use of non-static data member 'stu::n' "
- C++ Usage of AsyncCallback
- 错误:"Left of getValue must have class/struct/union"
- Centos7 g++ "to_string is not in a member of std"
- 在C++中使用 Catch 测试框架编译错误"error: expected ';' at end of declaration list"
- 传递 std::vector of std::shared_ptr,而不是更新对象
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- Number of tuples