Java 题解 | #牛群排队#

牛群排队

https://www.nowcoder.com/practice/8d8ae3937cd5466eb330ca484ca5ed80

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型二维数组
     */
    public int[][] cow_permute (int[] nums) {
        // write code here
        List<List<Integer>> res = new ArrayList<>();
        List<Integer> numList = new ArrayList<>();
        for (int num : nums) {
            numList.add(num);
        }

        Collections.sort(numList);
        backTracking(numList, new ArrayList<>(), res);

        int[][] ans = new int[res.size()][nums.length];
        for (int i = 0; i < res.size(); i++) {
            for (int j = 0; j < nums.length; j++) {
                ans[i][j] = res.get(i).get(j);
            }
        }

        return ans;
    }

    private void backTracking(List<Integer> nums, List<Integer> list,
                              List<List<Integer>> res) {
        if (list.size() == nums.size()) {
            res.add(new ArrayList<>(list));
            return;
        }

        for (int i = nums.size() - 1; i >= 0; i--) {
            if (list.contains(nums.get(i))) {
                continue;
            }
            list.add(nums.get(i));
            backTracking(nums, list, res);
            list.remove(list.size() - 1);
        }
    }
    }

编程语言是Java。

该题考察的知识点是回溯算法,通过递归和回溯的方式生成给定数组的全排列。

代码简短的文字解释如下:

  1. 将传入的整型数组转换为列表形式,并进行排序。
  2. 创建一个空的列表 res 用于存储结果。
  3. 调用 backTracking 方法进行回溯,传入原始列表 nums、一个空列表作为当前排列的中间结果,以及结果列表 res。
  4. 在 backTracking 方法中,首先判断如果中间结果列表长度等于原始列表长度,说明已经生成了一个完整的排列,将其加入结果列表中,然后返回。
  5. 遍历原始列表 nums,从后往前依次取出数字。如果当前数字已经在中间结果列表中,则跳过。
  6. 将当前数字添加到中间结果列表中。
  7. 递归调用 backTracking 方法,继续生成下一个数字的排列。
  8. 每次递归返回后,将中间结果列表的最后一个数字移除,以便尝试下一个数字的组合。
  9. 最后将结果列表 res 转换为二维数组,并返回结果。
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务