largest-divisible-subset
用了两种方法:
class Solution { // size of vector -> set of last item of vector map<int, set<int>> size_mp; // last item of vector -> whole vector map<int, vector<int>> result_mp; public: // if new item can divide last item, it can divide all items in vector, // so that no need to check previous item vector<int> largestDivisibleSubset(vector<int>& nums) { if (nums.size() < 1) { return nums; } sort(nums.begin(), nums.end()); for (vector<int>::iterator itr = nums.begin(); itr != nums.end(); ++itr) { // only need prev item to get whole items from result_mp int prev = -1; // iterator from longer vector to shorter for (map<int, set<int>>::reverse_iterator ritr = size_mp.rbegin(); ritr != size_mp.rend(); ++ritr) { for (set<int>::iterator sitr = ritr->second.begin(); sitr != ritr->second.end(); ++sitr) { // if last item of long vector can divide new number, // no need to check other vector or previous item if (*itr % *sitr == 0) { prev = *sitr; break; } } if (prev != -1) { break; } } vector<int> tmp_vec; if (prev != -1) { tmp_vec = result_mp[prev]; } tmp_vec.push_back(*itr); result_mp[*itr] = tmp_vec; int newsize = tmp_vec.size(); if (size_mp.find(newsize) == size_mp.end()) { set<int> tmp_set; tmp_set.insert(*itr); size_mp[newsize] = tmp_set; } else { size_mp[newsize].insert(*itr); } } set<int>::iterator sitr_new = size_mp.rbegin()->second.begin(); return result_mp[*sitr_new]; } };
31 / 31 test cases passed.
|
Status:
Accepted |
Runtime: 261 ms
|
开始用的下面这种方法,超时了:
class Solution { vector<int> nums; int nlen; vector<int> result; void func(vector<int>& iv, int index) { int vlen = iv.size(); int divisor = 1; if (vlen > 0) { divisor = iv[vlen-1]; } for (int k=index; k<nlen; ++k) { if (nums[k] % divisor != 0) { continue; } // without nums[k] func(iv, k+1); // with nums[k] iv.push_back(nums[k]); func(iv, k+1); iv.pop_back(); break; } if (iv.size() > result.size()) { result = iv; } } public: vector<int> largestDivisibleSubset(vector<int>& arg) { nums = arg; sort(nums.begin(), nums.end()); nlen = nums.size(); if (nlen <= 1) { return nums; } vector<int> tmp; func(tmp, 0); return result; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!