Java 算法:将数组元素划分成行数递减的二维数组
将数组元素划分成行数递减的二维数组
输入: nums = [1,3,4,1,2,3,1]
输出: [[1,3,4,2],[1,3],[1]]
解释: 根据题目要求可以创建包含以下几行元素的二维数组:
- 1,3,4,2
- 1,3
- 1
nums 中的所有元素都有用到,并且每一行都由不同的整数组成,所以这是一个符合题目要求的答案。可以证明无法创建少于三行且符合题目要求的二维数组。
class Solution {
public List<List<Integer>> findMatrix(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
Map<Integer, Integer> map = new HashMap<>();
for (int num : nums) {
map.put(num, map.getOrDefault(num, 0) + 1);
}
List<Integer> row = new ArrayList<>();
for (int num : nums) {
if (map.get(num) > 0) {
row.add(num);
map.put(num, map.get(num) - 1);
}
if (row.size() == 4) {
result.add(new ArrayList<>(row));
row.clear();
}
}
if (row.size() > 0) {
result.add(new ArrayList<>(row));
}
row.clear();
for (int num : nums) {
if (map.get(num) > 0) {
row.add(num);
map.put(num, map.get(num) - 1);
}
if (row.size() == 3) {
result.add(new ArrayList<>(row));
row.clear();
}
}
if (row.size() > 0) {
result.add(new ArrayList<>(row));
}
row.clear();
for (int num : nums) {
if (map.get(num) > 0) {
row.add(num);
map.put(num, map.get(num) - 1);
}
if (row.size() == 2) {
result.add(new ArrayList<>(row));
row.clear();
}
}
if (row.size() > 0) {
result.add(new ArrayList<>(row));
}
row.clear();
for (int num : nums) {
if (map.get(num) > 0) {
row.add(num);
map.put(num, map.get(num) - 1);
}
if (row.size() == 1) {
result.add(new ArrayList<>(row));
row.clear();
}
}
return result;
}
}
代码解释:
- 使用
HashMap存储每个数字出现的次数。 - 使用
ArrayList存储当前行的元素。 - 遍历数组,如果当前数字在
HashMap中的出现次数大于 0,则将其添加到当前行,并将其在HashMap中的出现次数减 1。 - 当当前行元素个数等于 4、3、2 或 1 时,将其添加到结果列表中,并清空当前行。
- 最后返回结果列表。
注意: 该代码假设输入数组的元素个数至少为 4。
原文地址: https://www.cveoy.top/t/topic/ndcB 著作权归作者所有。请勿转载和采集!