题解 | #牛群的特殊分组#

牛群的特殊分组

https://www.nowcoder.com/practice/ba62e31d82a04c9f8d0b0591ab8f2f06?tpId=363&tqId=10609147&ru=/exam/oj&qru=/ta/super-company23Year/question-ranking&sourceUrl=%2Fexam%2Foj

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型二维数组
     */
    public int[][] special_groups (int[] nums) {
        List<ArrayList<Integer>> resultList = new ArrayList<>();
        ArrayList<Integer> tempList = new ArrayList<>();
        boolean [] isSelected  = new boolean[nums.length];
        Arrays.sort(nums);
        backTrack(resultList, tempList, isSelected, nums, 0);
        int [][] result = new int[resultList.size()][];
        for (int i = 0; i < resultList.size(); i++) {
            int [] temp = new int [resultList.get(i).size()];
            for (int j = 0; j < resultList.get(i).size(); j++) {
                temp[j] = resultList.get(i).get(j);
            }
            result[i] = temp;
        }
        return result;
    }
    public void backTrack(List<ArrayList<Integer>> resultList,
                          ArrayList<Integer> tempList, boolean [] isSelected, int [] nums, int start) {
	  // 如果集合个数大于0,那么就添加到结果集合中
        if (tempList.size() > 0) {
            resultList.add(new ArrayList<>(tempList));
        }
	  // start是为了去除数字相同,但排序不同的 题目要求:不同小组之间的牛的编号组合不能完全相同。
        for (int i = start; i < nums.length; i++) {
            // 去重判断 如果两数相等,并且前一位数已经被使用过
            if (i > 0 && (nums[i] == nums[i - 1]) && !isSelected[i - 1]) {
                continue;
            }
            if (!isSelected[i]) {
                tempList.add(nums[i]);
                isSelected[i] = true;
			  // 下一次递归从i+1开始
                backTrack(resultList, tempList, isSelected, nums, i + 1);
			  // 重置标记和清除元素
                isSelected[i] = false;
                tempList.remove(tempList.size() - 1);
            }
        }
    }
}

本题知识点分析:

1.递归

2.回溯

3.数学模拟

4.集合存取

本题解题思路分析:

0.预处理,先将nums进行升序排序,那么查出来的自动按照字典序

1.利用递归和回溯,进行特殊数组查找

2.如果集合个数大于0,那么就添加到结果集合中

3.start是为了去除数字相同,但排序不同的 题目要求:不同小组之间的牛的编号组合不能完全相同。

4.去重判断 如果两数相等,并且前一位数已经被使用过

5.下一次递归从i+1开始

6.重置标记和清除元素

本题使用编程语言: Java

如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~

全部评论

相关推荐

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