给定数字n,找到两对可以将数字表示为两个多维数据集之和的对。换句话说,找到两对(a,b)和(c,d),使得给定数n可以表示为
n = a^3 + b^3 = c^3 + d^3
其中a,b,c和d是四个不同的数字。
例子:
Input: N = 1729
Output: (1, 12) and (9, 10)
Explanation:
1729 = 1^3 + 12^3 = 9^3 + 10^3
Input: N = 4104
Output: (2, 16) and (9, 15)
Explanation:
4104 = 2^3 + 16^3 = 9^3 + 15^3
Input: N = 13832
Output: (2, 24) and (18, 20)
Explanation:
13832 = 2^3 + 24^3 = 18^3 + 20^3
满足约束的任何数字n都将具有两个不同的对(a,b)和(c,d),使得a,b,c和d都小于n 1/3 。这个想法很简单。对于小于n 1/3的数字组成的每个对(x,y),如果它们的总和(x 3 + y 3 )等于给定的数字,则将它们存储在哈希表中,以sum为键。如果总和等于给定数字的对再次出现,我们只需打印两个对。
1) Create an empty hash map, say s.
2) cubeRoot = n1/3
3) for (int x = 1; x < cubeRoot; x++)
for (int y = x + 1; y <= cubeRoot; y++)
int sum = x3 + y3;
if (sum != n) continue;
if sum exists in s,
we found two pairs with sum, print the pairs
else
insert pair(x, y) in s using sum as key
以下是上述想法的实现–
C++
// C++ program to find pairs that can represent
// the given number as sum of two cubes
#include
using namespace std;
// Function to find pairs that can represent
// the given number as sum of two cubes
void findPairs(int n)
{
// find cube root of n
int cubeRoot = pow(n, 1.0/3.0);
// create an empty map
unordered_map > s;
// Consider all pairs such with values less
// than cuberoot
for (int x = 1; x < cubeRoot; x++)
{
for (int y = x + 1; y <= cubeRoot; y++)
{
// find sum of current pair (x, y)
int sum = x*x*x + y*y*y;
// do nothing if sum is not equal to
// given number
if (sum != n)
continue;
// if sum is seen before, we found two pairs
if (s.find(sum) != s.end())
{
cout << "(" << s[sum].first << ", "
<< s[sum].second << ") and ("
<< x << ", " << y << ")" << endl;
}
else
// if sum is seen for the first time
s[sum] = make_pair(x, y);
}
}
}
// Driver function
int main()
{
int n = 13832;
findPairs(n);
return 0;
}
Java
// Java program to find pairs that can represent
// the given number as sum of two cubes
import java.util.*;
class GFG
{
static class pair
{
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to find pairs that can represent
// the given number as sum of two cubes
static void findPairs(int n)
{
// find cube root of n
int cubeRoot = (int) Math.pow(n, 1.0/3.0);
// create an empty map
HashMap s = new HashMap();
// Consider all pairs such with values less
// than cuberoot
for (int x = 1; x < cubeRoot; x++)
{
for (int y = x + 1; y <= cubeRoot; y++)
{
// find sum of current pair (x, y)
int sum = x*x*x + y*y*y;
// do nothing if sum is not equal to
// given number
if (sum != n)
continue;
// if sum is seen before, we found two pairs
if (s.containsKey(sum))
{
System.out.print("(" + s.get(sum).first+ ", "
+ s.get(sum).second+ ") and ("
+ x+ ", " + y+ ")" +"\n");
}
else
// if sum is seen for the first time
s.put(sum, new pair(x, y));
}
}
}
// Driver code
public static void main(String[] args)
{
int n = 13832;
findPairs(n);
}
}
// This code is contributed by PrinciRaj1992
Python3
# Python3 program to find pairs
# that can represent the given
# number as sum of two cubes
# Function to find pairs that
# can represent the given number
# as sum of two cubes
def findPairs(n):
# Find cube root of n
cubeRoot = pow(n, 1.0 / 3.0);
# Create an empty map
s = {}
# Consider all pairs such with
# values less than cuberoot
for x in range(int(cubeRoot)):
for y in range(x + 1,
int(cubeRoot) + 1):
# Find sum of current pair (x, y)
sum = x * x * x + y * y * y;
# Do nothing if sum is not equal to
# given number
if (sum != n):
continue;
# If sum is seen before, we
# found two pairs
if sum in s.keys():
print("(" + str(s[sum][0]) +
", " + str(s[sum][1]) +
") and (" + str(x) +
", " + str(y) +
")" + "\n")
else:
# If sum is seen for the first time
s[sum] = [x, y]
# Driver code
if __name__=="__main__":
n = 13832
findPairs(n)
# This code is contributed by rutvik_56
C#
// C# program to find pairs that can represent
// the given number as sum of two cubes
using System;
using System.Collections.Generic;
class GFG
{
class pair
{
public int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to find pairs that can represent
// the given number as sum of two cubes
static void findPairs(int n)
{
// find cube root of n
int cubeRoot = (int) Math.Pow(n, 1.0/3.0);
// create an empty map
Dictionary s = new Dictionary();
// Consider all pairs such with values less
// than cuberoot
for (int x = 1; x < cubeRoot; x++)
{
for (int y = x + 1; y <= cubeRoot; y++)
{
// find sum of current pair (x, y)
int sum = x*x*x + y*y*y;
// do nothing if sum is not equal to
// given number
if (sum != n)
continue;
// if sum is seen before, we found two pairs
if (s.ContainsKey(sum))
{
Console.Write("(" + s[sum].first+ ", "
+ s[sum].second+ ") and ("
+ x+ ", " + y+ ")" +"\n");
}
else
// if sum is seen for the first time
s.Add(sum, new pair(x, y));
}
}
}
// Driver code
public static void Main(String[] args)
{
int n = 13832;
findPairs(n);
}
}
// This code is contributed by PrinciRaj1992
输出:
(2, 24) and (18, 20)
上述解决方案的时间复杂度为O(n 2/3 ),远小于O(n)。
我们可以在O(n 1/3 )时间内解决上述问题吗?我们将在下一篇文章中讨论。