当前位置

网站首页> 程序设计 > 开源项目 > 程序开发 > 浏览文章

[Leetcode] Permutations 置换

作者:小梦 来源: 网络 时间: 2024-01-28 阅读:

深度优先搜索

复杂度

时间 O(N) 空间 O(N) 递归栈

思路

置换实际上是给出所有的排列方式,同样是用深度优先搜索,不过为了避免重复选择的情况,我们要保证两点:第一,所有数必须是数组中的,第二,数组中每个数只能用不多于也不少于一次。如果我们要单独写一个函数,来判断下一轮搜索该选择哪一个数就很麻烦了。这里有一个技巧,我们可以只将数两两交换,不过交换时只能跟自己后面的交换。

代码

public class Solution {        List<List<Integer>> res;        public List<List<Integer>> permute(int[] nums) {        res = new LinkedList<List<Integer>>();        helper(nums, 0);        return res;    }        public void helper(int[] nums, int i){        // 找到转置完成后的解,将其存入列表中        if(i == nums.length - 1){List<Integer> list = new LinkedList<Integer>();for(int j = 0; j < nums.length; j++){    list.add(nums[j]);}res.add(list);        }        // 将当前位置的数跟后面的数交换,并搜索解        for(int j = i; j < nums.length; j++){swap(nums, i , j);helper(nums, i + 1);swap(nums, i, j);        }    }        private void swap(int[] nums, int i, int j){        int tmp = nums[i];        nums[i] = nums[j];        nums[j] = tmp;    }}

热点阅读

网友最爱