Re: [閒聊] 每日LeetCode已回收

看板Marginalman作者 (みけねこ的鼻屎)時間1年前 (2024/02/09 15:10), 1年前編輯推噓4(400)
留言4則, 4人參與, 1年前最新討論串666/719 (看更多)
※ 引述 《Rushia (みけねこ的鼻屎)》 之銘言: :   : https://leetcode.com/problems/largest-divisible-subset/description : 368. Largest Divisible Subset : 給你一個陣列nums,找出由他的元素組成的最大子集合,所有元素滿足 : nums[i] % nums[j] == 0 or nums[j] % nums[i] == 0,如果有多個解返回任意一個。

02/09 14:57,
可是n^2 贏70幾趴欸 這題還有其他解法嗎
02/09 14:57
思路: 1.同第一篇,但是不存最大的子集合有哪些元素,只存 當前最大子集合大小 => dp[i] 目前最大的子集合的"最大元素"和"集合大小" 2.我們知道最佳集合的最大元素和集合大小之後,只要當前最大值滿足 「可被整除」且「dp[i] = maxSize」就表示這個元素是包含在最大子集合, 把該數字加入解集合就可以回溯出最大子集合。 Java Code: --------------------------------------------------------- class Solution { public List<Integer> largestDivisibleSubset(int[] nums) { int n = nums.length; Arrays.sort(nums); int[] dp = new int[n]; int maxVal = nums[0], maxSize = 0; for (int i = 0; i < n; i++) { dp[i] = 1; for (int j = 0; j < i; j++) { if (nums[i] % nums[j] == 0) { dp[i] = Math.max(dp[i], dp[j] + 1); } } if (dp[i] > maxSize) { maxSize = dp[i]; maxVal = nums[i]; } } List<Integer> res = new ArrayList<>(); for (int i = n - 1; i >= 0; i--) { if (dp[i] == maxSize && maxVal % nums[i] == 0) { maxSize--; maxVal = nums[i]; res.add(nums[i]); } } return res; } } --------------------------------------------------------- Beats99.83% 供參 -- https://i.imgur.com/hhXzZJ3.jpg
-- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.100.73.13 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1707462623.A.086.html ※ 編輯: Rushia (122.100.73.13 臺灣), 02/09/2024 15:11:20

02/09 15:11, 1年前 , 1F
大師
02/09 15:11, 1F

02/09 15:15, 1年前 , 2F
這個記法好猛 少一條陣列捏
02/09 15:15, 2F

02/09 15:16, 1年前 , 3F
大師
02/09 15:16, 3F

02/09 15:52, 1年前 , 4F
大師
02/09 15:52, 4F
文章代碼(AID): #1bnS_V26 (Marginalman)
討論串 (同標題文章)
文章代碼(AID): #1bnS_V26 (Marginalman)