美文网首页
Leetcode 46 全排列

Leetcode 46 全排列

作者: itbird01 | 来源:发表于2022-01-02 00:12 被阅读0次
    题目.png

    题意:给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。

    解法:
    1.审题可知,其实就是回溯算法的应用
    2.排列组合的回溯算法实现

    回溯算法理解

    概念

    回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

    回溯其实也是一种递归,有以下四个参数,当然不一定是我所举例的类型,要看题目而定一个全局变量集合保存所有满足条件的答案,举例:List<List<Integer>> list,一个集合保存一个满足条件的答案,举例:List<Integer> tempList,算法问题给所给的输入条件,这个可能是一个字符串,也可能是一个数组

    总结

    此题解法的理解,其实就是for循环,从0开始,递归遍历,以1开头的所有情况,遍历过程中,需要判断当前解中是否含有当前元素了,如果含有,则继续。然后判断以2开头的所有情况。直到数组末尾元素为头的情况遍历完成。
    回溯算法的

    ##解法1
    iimport java.util.ArrayList;
    import java.util.List;
    
    class Solution {
        List<List<Integer>> ans = new ArrayList<List<Integer>>();
        List<Integer> temp = new ArrayList<Integer>();
        public List<List<Integer>> permute(int[] nums) {
            backSearch(nums);
            return ans;
        }
        private void backSearch(int[] nums) {
            if (temp.size() == nums.length) {
                ans.add(new ArrayList<Integer>(temp));
                return;
            }
    
            for (int i = 0; i < nums.length; i++) {
                if (!temp.contains(nums[i])) {
                    temp.add(nums[i]);
                    backSearch(nums);
                    temp.remove(temp.size() - 1);
                }
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:Leetcode 46 全排列

          本文链接:https://www.haomeiwen.com/subject/kheiqrtx.html