转换二维数组
- 虽然是medium题,但考察的是C++/golang实现基本功:hash-map和vector操作
给你一个整数数组 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 中的所有元素都有用到,并且每一行都由不同的整数组成,所以这是一个符合题目要求的答案。
可以证明无法创建少于三行且符合题目要求的二维数组。
C++实现
class Solution {
public:
vector<vector> findMatrix(vector& nums) {
// hash-map counter + 贪心算法
unordered_map mp; // val -> counter
for (const auto & e : nums) {
mp[e]++;
}
vector<vector> res;
while (mp.size() > 0) {
vector path;
for (auto it = mp.begin(); it != mp.end();) {
path.push_back(it->first);
it->second--;
if (it->second == 0) {
it = mp.erase(it);
} else {
it++;
}
}
res.push_back(path);
}
return res;
}
};
golang实现
func findMatrix(nums []int) [][]int {
// hash-map counter + 贪心算法
mp := map[int]int{}
for _, v := range nums {
mp[v]++
}
res := [][]int{}
for len(mp) > 0 {
path := []int{}
for k := range mp {
path = append(path, k)
mp[k]--
if mp[k] == 0 {
delete(mp, k)
}
}
res = append(res, path)
}
return res
}