【力扣刷题】2610.转换二维数组-哈希表
给你一个整数数组 nums
。请你创建一个满足以下条件的二维数组:
- 二维数组应该 只 包含数组
nums
中的元素。 - 二维数组中的每一行都包含 不同 的整数。
- 二维数组的行数应尽可能 少 。
返回结果数组。如果存在多种答案,则返回其中任何一种。
请注意,二维数组的每一行上可以存在不同数量的元素。
示例 1:
输入:nums = [1,3,4,1,2,3,1] 输出:[[1,3,4,2],[1,3],[1]] 解释:根据题目要求可以创建包含以下几行元素的二维数组: - 1,3,4,2 - 1,3 - 1 nums 中的所有元素都有用到,并且每一行都由不同的整数组成,所以这是一个符合题目要求的答案。 可以证明无法创建少于三行且符合题目要求的二维数组。
示例 2:
输入:nums = [1,2,3,4] 输出:[[4,3,2,1]] 解释:nums 中的所有元素都不同,所以我们可以将其全部保存在二维数组中的第一行。
提示:
1 <= nums.length <= 200
1 <= nums[i] <= nums.length
class Solution {
public:
vector<vector<int>> findMatrix(vector<int>& nums) {
map<int,int>mp;
for(int x:nums){
mp[x]++;
}
vector<vector<int>> res;
int s=mp.size();
while(s>0){
vector<int>a;
for(auto x:mp){
// cout<<x.first<<" "<<mp[x.first]<<" "<<s<<endl;
if(mp[x.first]){
a.push_back(x.first);
mp[x.first]--;
if(!mp[x.first]){
s--;
}
}
// for(int i:a){
// cout<<i<<" ";
// }
// cout<<endl;
}
res.push_back(a);
}
return res;
}
};
官方:
class Solution {
public:
vector<vector<int>> findMatrix(vector<int>& nums) {
unordered_map<int, int> cnt;
for (int x : nums) {
cnt[x]++;
}
vector<vector<int>> ans;
while (!cnt.empty()) {
vector<int> arr;
for (auto it = cnt.begin(); it != cnt.end(); ) {
it->second -= 1;
arr.emplace_back(it->first);
if (it->second == 0) {
it = cnt.erase(it);
} else {
it++;
}
}
ans.push_back(arr);
}
return ans;
}
};
版权声明:
作者:Zhang, Hongxing
链接:http://zhx.info/archives/556
来源:张鸿兴的学习历程
文章版权归作者所有,未经允许请勿转载。
THE END
二维码
文章目录
关闭