文章
10
粉丝
66
获赞
3
访问
45.3k
思路
构造一张图,包含所有的边 ii 到 jj ,如果满足 A[i] + A[j]A[i]+A[j] 是一个完全平方数。我们的目标就是求这张图的所有哈密顿路径,即经过图中所有点仅一次的路径。
算法
我们使用 count 记录对于每一种值还有多少个节点等待被访问,与一个变量 todo 记录还剩多少个节点等待被访问。
对于每一个节点,我们可以访问它的所有邻居节点(从数值的角度来看,从而大大减少复杂度)。
对于每一个节点,我们可以访问它的所有邻居节点(从数值的角度来看,从而大大减少复杂度)。
更多细节请看行内注释。
class Solution {
Map<Integer, Integer> count;
Map<Integer, List<Integer>> graph;
public int numSquarefulPerms(int[] A) {
int N = A.length;
count = new HashMap();
graph = new HashMap();
// count.get(v) : 数组 A 中值为 v 的节点数量
for (int x: A)
count.put(x, count.getOrDefault(x, 0) + 1);
// graph.get(v) : 在 A 中的值 w 满足 v + w 是完全平方数
// (ie., "vw" is an edge)
for (int x: count.keySet())
graph.put(x, new ArrayList());
for (int x: count.keySet())
for (int y: count.keySet()) {
int r = (int) (Math.sqrt(x + y) + 0.5);
if...
登录后发布评论
暂无评论,来抢沙发