将数组元素划分成行数递减的二维数组

输入: 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;
    }
}

代码解释:

  1. 使用 HashMap 存储每个数字出现的次数。
  2. 使用 ArrayList 存储当前行的元素。
  3. 遍历数组,如果当前数字在 HashMap 中的出现次数大于 0,则将其添加到当前行,并将其在 HashMap 中的出现次数减 1。
  4. 当当前行元素个数等于 4、3、2 或 1 时,将其添加到结果列表中,并清空当前行。
  5. 最后返回结果列表。

注意: 该代码假设输入数组的元素个数至少为 4。

Java 算法:将数组元素划分成行数递减的二维数组

原文地址: https://www.cveoy.top/t/topic/ndcB 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录