JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2024-09-22
目录

平方数组的数目Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

如果一个数组的任意两个相邻元素之和都是 完全平方数 ,则该数组称为 平方数组 。

给定一个整数数组 nums,返回所有属于 平方数组 的 nums 的排列数量。

如果存在某个索引 i 使得 perm1[i] != perm2[i],则认为两个排列 perm1 和 perm2 不同。

示例 1:

输入:nums = [1,17,8] 输出:2 解释:[1,8,17] 和 [17,8,1] 是有效的排列。 示例 2:

输入:nums = [2,2,2] 输出:1

提示:

  • 1 <= nums.length <= 12
  • 0 <= nums[i] <= 109

# 思路

状压+去重

# 解法

class Solution {
    private int n;
    private int[] nums;
    private int[][] memo;

    public int numSquarefulPerms(int[] nums) {
        this.nums = nums;
        n = nums.length;
        memo=new int[1<<n][n];
        for(var a:memo) Arrays.fill(a,-1);
        Arrays.sort(nums);
        return dfs(0, 0);
    }

    public int dfs(int s, int pre) {
        if (s == (1 << n) - 1) {
            return 1;
        }
        int j = Integer.bitCount(s);
        int ans = 0;
        //同一层不能添加相同数据
        if(memo[s][pre]!=-1) return memo[s][pre];
        for (int i = 0; i < n; i++) {
            //如果相邻 并且不是第一个 且上一个没选 代表这种方案不行 重复啦
            if(i>0&&(s>>(i-1)&1)==0&&nums[i]==nums[i-1]) continue;
            if (((s >> i & 1) == 0 && isValid(nums[i] +nums[pre])) || j == 0) {

                ans += dfs(s | 1 << i, i);
            }

        } 
        return memo[s][pre]=ans;
    }

    public boolean isValid(int i) {
        int a = (int) Math.sqrt(i);
        return i == a * a;
    }

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
#Java
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式