ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[LeetCode] 368. Largest Divisible Subset

2020-06-14 11:05:13  阅读:313  来源: 互联网

标签:Subset count nums Divisible maxIndex int 数组 整除 LeetCode


Given a set of distinct positive integers, find the largest subset such that every pair (Si, Sj) of elements in this subset satisfies:

Si % Sj = 0 or Sj % Si = 0.

If there are multiple solutions, return any subset is fine.

Example 1:

Input: [1,2,3]
Output: [1,2] (of course, [1,3] will also be ok)

Example 2:

Input: [1,2,4,8]
Output: [1,2,4,8]

最大整除子集。题意是给一个整数数组,请你找出最长的一个子串,子串满足任意两个数之间可以互相整除,即任意两个数之间互相整除的时候余数为0。比如两个数A和B好了,A%B = 0或者B%A = 0都可以满足题意。

思路是DP动态规划。这个题的思路跟300题很像。一个写的很好的帖子。首先,两个不同的数字A和B,既然不同,那么一定一大一小,那么一定意味着小的除以大的的余数一定不为0。题目既然规定了A%B = 0或者B%A = 0都可以满足题意,我们可以先将input从小到大排序。这样扫描数组的时候可以从当前位置往前看,看当前数字nums[i]是否可以整除比他小的数字。

接着创建一个数组count[i],记录的是以nums[i]结尾的,最长的满足题意的子串的长度。这个数组count[i]初始化的时候每个位置都是1,因为每个数字除以他本身的余数都为0。接着会用到两个for loop,一个是遍历nums数组,一个是将nums[i]去跟比他自己小的所有的数字都去做一下除法,看看有多少数字能跟nums[i]相除 == 0。此时count[i]数组会被改写。

接着再次扫描count[i]数组,找出最大值maxIndex。这个最大值是最长的子串的长度。同时找到的最大值背后的nums[maxIndex],也是这个子串的最后一个元素。

最后一步是从nums[maxIndex]开始往前扫描,如果遇到任何一个数字能被nums[maxIndex]整除,则把这个数字加入结果集。

时间O(n^2)

sort - O(nlogn)

扫描,写入count[i]的值 - O(n^2)

空间O(n)

Java实现

 1 class Solution {
 2     public List<Integer> largestDivisibleSubset(int[] nums) {
 3         List<Integer> res = new ArrayList<>();
 4         int n = nums.length;
 5         if (n == 0) {
 6             return res;
 7         }
 8         Arrays.sort(nums);
 9         int[] count = new int[nums.length];
10         Arrays.fill(count, 1);
11         for (int i = 1; i < nums.length; i++) {
12             for (int j = i - 1; j >= 0; j--) {
13                 if (nums[i] % nums[j] == 0) {
14                     count[i] = Math.max(count[i], count[j] + 1);
15                 }
16             }
17         }
18         
19         int maxIndex = 0;
20         for (int i = 1; i < nums.length; i++) {
21             maxIndex = count[i] > count[maxIndex] ? i : maxIndex;
22         }
23         
24         int temp = nums[maxIndex];
25         int curCount = count[maxIndex];
26         for (int i = maxIndex; i >= 0; i--) {
27             if (temp % nums[i] == 0 && count[i] == curCount) {
28                 res.add(nums[i]);
29                 temp = nums[i];
30                 curCount--;
31             }
32         }
33         return res;
34     }
35 }

 

相关题目

300. Longest Increasing Subsequence

368. Largest Divisible Subset

LeetCode 题目总结

标签:Subset,count,nums,Divisible,maxIndex,int,数组,整除,LeetCode
来源: https://www.cnblogs.com/cnoodle/p/13124054.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有