最大整除子集 · 6 月更文挑战

105 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情

一、题目描述:

给你一个由 无重复 正整数组成的集合 nums ,请你找出并返回其中最大的整除子集 answer ,子集中每一元素对 (answer[i], answer[j]) 都应当满足: answer[i] % answer[j] == 0 ,或 answer[j] % answer[i] == 0 如果存在多个有效解子集,返回其中任何一个均可。

示例 1:

输入:nums = [1,2,3] 输出:[1,2] 解释:[1,3] 也会被视为正确答案。 示例 2:

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

提示:

1 <= nums.length <= 1000 1 <= nums[i] <= 2 * 109 nums 中的所有整数 互不相同

来源:力扣(LeetCode) 链接:leetcode.cn/problems/la… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

先排序获得升序数组 从小到大遍历数组,并将满足条件的数字对(i,j)看作从节点i指向节点j的一条边 以pair存储节点信息,first为到该节点的最长步数,second为最长步数时的上一个节点 若从i到j的路径比之前存储的路径更长,更新 每次遍历后更新当前路径的最大值与最大值位置 遍历结束后,根据最大值所在位置倒序输出(pair中存储了之前的位置信息)即可。

三、AC 代码:

class Solution {
    class Node {
        Node next;
        int seq;
        int val;
​
        public Node(int seq, int val) {
            this.seq = seq;
            this.val = val;
        }
    }
​
    public List<Integer> largestDivisibleSubset(int[] nums) {
        Arrays.sort(nums);
        Node[] heads = new Node[nums.length];
        Node first = new Node(1, nums[0]);
        int p = 0;
        heads[p++] = first;
        Node max = first;
        for (int i = 1; i < nums.length; i++) {
            int cur = nums[i];
            Node node = new Node(1, cur);
            for (int j = p - 1; j >= 0; j--) {
                Node head = heads[j];
                if (cur % head.val == 0 && head.seq >= node.seq) {
                    node.seq = head.seq + 1;
                    node.next = head;
                    if (node.seq > max.seq) {
                        max = node;
                    }
                }
            }
            heads[p++] = node;
        }
        List<Integer> ans = new ArrayList<>();
        while (max != null) {
            ans.add(max.val);
            max = max.next;
        }
        return ans;
    }
}
​

四、总结:

结果截图

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助,期待您找到心意的工作和满意的offer

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注Jam,从你我做起!

\