NC207473. 牛牛找子集
描述
输入描述
示例1
输入:
12,5,[1,1,1,1,1,1,2,2,2,2,2,2]
输出:
[1,1,1,2,2]
说明:
一共有12个数字,需要找到大小为5的子集,[1,1,1,2,2]这样的子集一共有两个,满足游戏规则且字典序最小。示例2
输入:
7,3,[1,2,3,2,4,3,1]
输出:
[1,2,3]
说明:
一共有7个数字,需要找到大小为3的子集,[1,2,3]这样的子集一共有两个,满足游戏规则且字典序最小。Python3(3.5.2) 解法, 执行用时: 777ms, 内存消耗: 15924K, 提交时间: 2020-08-14 16:19:18
# # 返回找到能够满足游戏胜利条件的子集,如果有多个子集满足条件,返回字典序最小的即可。 # @param n int整型 代表数字的数量 # @param k int整型 代表子集的大小 # @param s int整型一维数组 代表数字数组 # @return int整型一维数组 # class Solution: def solve(self , n , k , s ): # write code here from collections import Counter s = Counter(s) def judge(x): out = {} cur = 0 for j in s: out[j] = s[j] // x cur += out[j] if cur < k: return [] res = [] rest = k for j in sorted(out): if out[j] >= rest: res.extend([j]*rest) return res else: res.extend([j]*out[j]) rest -= out[j] for i in range(n//k, 0, -1): ans = judge(i) if ans: return ans
C++11(clang++ 3.9) 解法, 执行用时: 31ms, 内存消耗: 3612K, 提交时间: 2020-08-14 00:05:26
class Solution { public: vector<int> solve(int n,int k,vector<int> &s) { vector<int> ans; map<int,int> cnt; for(auto a:s) { cnt[a]++; } auto ptr=cnt.begin(); while(k) { for(int i=0;i<min(ptr->second,k);i++) ans.push_back(ptr->first); k-=min(ptr->second,k); ptr++; } return ans; } };