题目链接
思路1: O(logN) + O(N)
class Solution {
public:// O(logN) + O(N)vector<vector<int>> findMatrix(vector<int>& nums) {unordered_map<int,int> cnt;for(auto &x : nums) cnt[x] ++ ;sort(nums.begin(), nums.end(), [&](int x, int y){return cnt[x] > cnt[y]; // Problem Here});for(auto &x : nums) cout << x << ' '; cout << endl;int maxLen = cnt[nums[0]];vector<vector<int>> res(maxLen);for(int i = 0; i < nums.size(); ) {for(int j = 0; j < cnt[nums[i]]; j ++ ) res[j].push_back(nums[i]);i += cnt[nums[i]];}return res;}
};
我的思路是将 nums
进行排序,然后出现次数多的放在前面,出现次数少的放在后面,例如输入 nums=[8,4,3,4,4,6,3,3]
,我们希望输出 nums=[4,4,4,3,3,3,8,6]
。然后就可以遍历同一元素,依次加入每一行。
但实际上,对于该输入,输出 nums=[4,3,4,4,3,3,8,6]
,可以发现,元素 3
和 4
并没有按照我们希望的那样(3
全在前面或者 4
全在前面),而是杂糅到一起了,也就是说,我们的 sort
只是按照元素的 cnt
进行了排序,但是对于 cnt
相同的不同元素,并没有合理排序。
为了解决这个问题,我们希望特殊处理 cnt
相等时的情况,这里只需要稍微修改一下 sort
函数即可:
sort(nums.begin(), nums.end(), [&](int x, int y){if(cnt[x] == cnt[y]) return x < y;return cnt[x] > cnt[y];
});
思路2:O(N)+O(N)
不过我们其实可以发现,上面对 nums 进行排序的行为有些画蛇添足了,因此我们并没有让 nums 按照 cnt 排序的需求。事实上,我们可以直接利用 cnt 数组。
class Solution {
public:vector<vector<int>> findMatrix(vector<int>& nums) {unordered_map<int,int> cnt;vector<vector<int>> res;for(auto &x : nums) ++ cnt[x];int idx = 0, n = nums.size();while(idx < n) {vector<int> path;for(auto &it : cnt) {if(it.second) {-- it.second, ++ idx, path.push_back(it.first);}}res.push_back(path);}return res;}
};