1. question: 全排列(中等)
给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/permutations
示例 1:
1 2
| 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
|
示例 2:
1 2
| 输入:nums = [0,1] 输出:[[0,1],[1,0]]
|
示例 3:
提示:
1 2 3
| 1 <= nums.length <= 6 -10 <= nums[i] <= 10 nums 中的所有整数 互不相同
|
2. answers
这道题是排列问题,即组合的元素是有序的。相对于前面的子集组合等问题,有如下区别:
- 组合的长度和给定的数组是相同的;
- 不同的组合,只要有一个对应下标位置的元素不同,那么组合就不算重复。
简单地说,就是每个元素都可以取数组中的全部值。但是必须要和前面的元素取值不同。以[1,2,3]为例,第一个元素有三种选择,如果它选了1,那么第二个元素只能选2或者3,如果它选了2,第三个元素只能选3。反过来,如果第一个元素元素选了2,那么第二个元素能选1或者3,如果选了1,第三个元素只能选3。
总之,一个组合中,每个元素都可以取数组中的全部值,并且只能是在前面元素挑剩下的数组元素中选择。因此,总体步骤和组合类似,只不过在递归下一个元素的时候,需要传入下一个元素所能选取的元素。递归终止条件是组合的长度为数组的长度。
为了传入下一个元素所选取的元素,设置一个辅助空间,保存应该下一个元素应该选取的集合,为了方便,我存储的是下标。代码如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| public class Solution_0088 {
public List<List<Integer>> result = new ArrayList<>();
public LinkedList<Integer> group = new LinkedList<>();
public void generatePmt(int[] nums, ArrayList<Integer> lList) {
if(group.size() == nums.length) {
result.add(new ArrayList<>(group)); return; }
for (int i = 0; i < lList.size(); i++) {
group.add(nums[lList.get(i)]);
ArrayList<Integer> temp = new ArrayList<>(lList); temp.remove(i); generatePmt(nums, temp);
group.removeLast(); }
}
public List<List<Integer>> permute(int[] nums) {
ArrayList<Integer> indexArr = new ArrayList<>();
for (int i = 0; i < nums.length; i++) { indexArr.add(i); }
generatePmt(nums, indexArr);
return result; }
public static void main(String[] args) { System.out.println();
int[] nums = {1};
Solution_0088 s = new Solution_0088();
List<List<Integer>> result = s.permute(nums);
for(List<Integer> list: result){
for(Integer i: list) System.out.print(i + "\t");
System.out.println(); } } }
|
3. 备注
参考力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 (leetcode-cn.com),代码随想录 (programmercarl.com)。