题目:
给你一个整数数组 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
详解:
题目还是很容易理解的,就是把一维数组的数,分成二维数组,但是每一行的数字不重复,生成最小行数。
会hashmap,就很容易做出来。键是数字,键值是数字个数,然后往二维list里插入,当键值到零,清除这个键,需要掌握迭代器遍历方法。
不用hashmap就是把二维数组转换为list,然后遍历,每插入一个删除一个,直到该list为空,若有则不插入,等着下次遍历往下一行插入
代码:
Hashmap代码:
class Solution {
public List<List<Integer>> findMatrix(int[] nums) {
Map<Integer,Integer>map = new HashMap<>();//创建
for(int num:nums){
map.put(num,map.getOrDefault(num,0)+1);//如果存在,返回num+1,如果不存在返回0+1,
}
List<List<Integer>> ans = new ArrayList();
while(!map.isEmpty()){
List<Integer> row = new ArrayList<>();
Iterator<Map.Entry<Integer,Integer>> it = map.entrySet().iterator();
while(it.hasNext()){//迭代器遍历hashmap
Map.Entry<Integer,Integer> entry = it.next();
int key = entry.getKey();
int value = entry.getValue();
row.add(key);
if(value-1==0){
it.remove();
}
else{
map.put(key,value-1);
}
}
ans.add(row);
}
return ans;
}
}