Google – Good Number
一个数如果能用两个立方数相加,并且存在两组这样的立方数,这个数就是一个Good Number.
求小于等于n的所有Good Number.
[Solution]
算是暴力解。
1. 关键点就是先求出小于等于n之内的所有立方数。共有n^(1/3)个立方数。 O(n^(1/3))
2. 然后将这些立方数两两相加求和,并用一个hash table存sum -> count。 O(n^(2/3))
3. 最后扫一遍1到n,如果存在于hash table里并且count大于等于2,就是一个good number。 O(n)
[Time]
总的时间复杂度为O(n^(2/3)), 空间复杂度也为O(n^(2/3))
Read full article from Google – Good Number
一个数如果能用两个立方数相加,并且存在两组这样的立方数,这个数就是一个Good Number.
求小于等于n的所有Good Number.
[Solution]
算是暴力解。
1. 关键点就是先求出小于等于n之内的所有立方数。共有n^(1/3)个立方数。 O(n^(1/3))
2. 然后将这些立方数两两相加求和,并用一个hash table存sum -> count。 O(n^(2/3))
3. 最后扫一遍1到n,如果存在于hash table里并且count大于等于2,就是一个good number。 O(n)
[Time]
总的时间复杂度为O(n^(2/3)), 空间复杂度也为O(n^(2/3))
public List<Integer> goodNumber(int n) { List<Integer> result = new ArrayList<>(); List<Integer> cubeNum = new ArrayList<>(); for (int i = 1; (int) Math.pow(i, 3) <= n; i++) { cubeNum.add((int) Math.pow(i, 3)); } Map<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < cubeNum.size(); i++) { for (int j = i + 1; j < cubeNum.size(); j++) { int sum = cubeNum.get(i) + cubeNum.get(j); map.put(sum, map.getOrDefault(sum, 0) + 1); } } for (int i = 1; i <= n; i++) { if (map.containsKey(i) && map.get(i) >= 2) { result.add(i); } } return result;}