持续创作,加速成长!这是我参与「掘金日新计划 · 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,从你我做起!
\