递归:列出不重复的数组

题目https://www.nowcoder.com/practice/4bcf3081067a4d028f95acee3ddcd2b1?tpId=295&tqId=701&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
已经很久没有做递归题目了,完完全全忘干净了哈哈哈。写代码就是学了忘,忘了学。今天开始进军前端了,Dart真是和Java差不多的语言,但是还是需要保持每天写Java保持代码习惯,不能捡了芝麻丢了西瓜。
题外话结束,首先先做一个接收全部结果的list列表,之后定义一个递归用的列表list。在递归方法中,方法体要有题目给的数组num,另外一个就是随时插入的list。判断条件就是列表长度是否等于数组长度,如果列表长度等于数组长度即加入最终列表然后结束(返回上一层)。
循环条件,在数组中循环,如果列表没有出现,那么直接添加到列表中,然后再次进行递归,如果出现了,就跳过本次循环,继续下一次循环找到没有出现的元素。但是删除最后一个元素的作用是什么还是不太明白。
图片说明

import java.util.*;
public class Solution {
    // 存所有排列的集合
    ArrayList<ArrayList<Integer>> res = new ArrayList<>();
    public ArrayList<ArrayList<Integer>> permute(int[] num) {
        // 存一种排列
        LinkedList<Integer> list = new LinkedList<>();
        // 递归进行
        backTrack(num,list);
        return res;
    }

    public void backTrack(int[] num, LinkedList<Integer> list){
        // 当list中的长度等于数组的长度,则证明此时已经找到一种排列了
        if(list.size() == num.length){
            // add进返回结果集中
            res.add(new ArrayList<>(list));
            return;
        }
        // 遍历num数组
        for(int i = 0; i < num.length; i++){
            // 若当前位置中的数已经添加过了则跳过
            if(list.contains(num[i]))
                continue;
            // 选择该数
            list.add(num[i]);
            // 继续寻找
            backTrack(num,list);
            // 撤销最后一个
            list.removeLast();
        }
    }
}
全部评论

相关推荐

面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务