算法分析
(与带分数的转换方法类似)
-
1、$a^2 + b^2 + c^2 + d^2 = n$可以转换成 $c^2 + d^2 = n - a^2 - b^2$
-
2、通过哈希表存储$c^2 + d^2$的值
-
3、枚举
a
和b
,若$n - a^2 - b^2$在哈希表中存在,则表示一定存在c
和d
,满足方程
时间复杂度 $O(n^2)$
Java 代码
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
static Map<Integer,Integer> map = new HashMap<Integer,Integer>();
public static void solve(int n)
{
//1、预处理,使用哈希表记录c*c + d*d的值
for(int i = 0;i * i * 2 <= n;i++)
for(int j = i;i * i + j * j <= n;j ++)
if(!map.containsKey(i * i + j * j))
map.put(i * i + j * j, i);
//2、枚举a,b
for(int i = 0;i * i * 4 <= n;i++)
for(int j = i;(i * i + j * j) * 2 <= n;j++)
{
//若c^2 + d^2 = n - a^2 - b^2;
if(map.containsKey(n - i * i - j * j))
{
int c = map.get(n - i * i - j * j);
int d = (int) Math.sqrt(n - i * i - j * j - c * c);
System.out.println(i + " " + j + " " + c + " " + d + " ");
return;
}
}
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
solve(n);
}
}
为啥以平方速度递增的的时间复杂度不是 O(√n)* O(√n) = O(n)
6
大佬请问下我这哪错了呢?明明都是从小到大排序的,边界条件不同虽然不知道你的2或4的意义。我这100算的是0068,却不是000 10,实在找不出来了TT
这行多了个分号,也就是无论啥情况都覆盖掉了,应该是大意了hh
顶~
我也是写Java的,我每次都会来看一下你的代码😂😂
一起加油hhh