From 60d813e02c117b3bbe383298d64f5a6d74265e42 Mon Sep 17 00:00:00 2001 From: mahaozhong <1831866525@qq.com> Date: Fri, 23 Apr 2021 11:00:16 +0800 Subject: [PATCH] LeetCode-368 --- 368/code.cpp | 38 ++++++++++++++++++++++++++++++++++++++ 368/solution.md | 5 +++++ 2 files changed, 43 insertions(+) create mode 100644 368/code.cpp create mode 100644 368/solution.md diff --git a/368/code.cpp b/368/code.cpp new file mode 100644 index 0000000..4eea540 --- /dev/null +++ b/368/code.cpp @@ -0,0 +1,38 @@ +class Solution { +public: + // 时间复杂度:O(n^2) + // 其实只需要考虑一个整除的方向即可,即使前面较小的元素集合不正确,但是最终答案是正确的 + vector largestDivisibleSubset(vector& nums) { + int len = nums.size(); + if (len == 1) { + return nums; + } + // 方便进行dp,保证一个数整除比他小的数时,下标不会超过当前元素 + sort(nums.begin(), nums.end()); + unordered_map> mp; + mp.clear(); + for (int i = 0; i < len; i++) { + vector temp = {nums[i]}; + mp[i] = temp; + for (int j = 0; j < i; j++) { + if (nums[i] % nums[j] == 0) { + // 可以进行转移 + if (mp[j].size() + 1 > mp[i].size()) { + temp = mp[j]; + temp.emplace_back(nums[i]); + mp[i] = temp; + } + } + } + } + int solve = 0; + vector ans; + for (auto& it : mp) { + if ((it).second.size() > solve) { + solve = (it).second.size(); + ans = (it).second; + } + } + return ans; + } +}; diff --git a/368/solution.md b/368/solution.md new file mode 100644 index 0000000..7fc5903 --- /dev/null +++ b/368/solution.md @@ -0,0 +1,5 @@ +#### 动态规划 +* 原数组sort排序,保证了前面的数可以被后面的数整除,捋清乱序情况下数的整除关系 +* 整除具有传递性,假设三个数a,b,c满足b%a=0 和c%b=0,那么必然存在c%a=0 +* 根据上述传递性,我们可以写出转移方程,默认情况下dp[i] = {nums[i],} ,遍历j\