【LeetCode-中等题】46. 全排列

这篇具有很好参考价值的文章主要介绍了【LeetCode-中等题】46. 全排列。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

组合+并集问题汇总:

1、子集去重版本
2、组合去重版本
3、子集非去重版本

题目

【LeetCode-中等题】46. 全排列,力扣,# 中等题,leetcode,算法,职场和发展
这题中nums中的数各不相同,所以不需要去重:
而下面这题,nums中的数会存在重复值,就需要去重:

参考讲解视频:代码随想录—全排列不去重版本

方法一:递归+回溯

关键在于递归之后还要还原做回溯动作:

	path.add(nums[i]);//加入子结果集
    usered[i] = true;//将该位置标志位标为true  往下不能取了
    backtrace(nums,path,usered);//往下面继续递归
    usered[i] = false;//某次递归结束后,要回溯回去,就得把之前该的标志位还原
    path.remove(path.size()-1);//某次递归结束后,要回溯回去,当前path应该把递归之前加的元素给剔除掉

【LeetCode-中等题】46. 全排列,力扣,# 中等题,leetcode,算法,职场和发展

所以最后,我们统计到的res才是不断扩增结果集的,而usered标志数组和list子集合其实都是中间临时的,是会随着递归改变,并且随着回溯复原的,所以程序最后list子集合肯定是空的,并且标志数组也是初始化的时候的样子

所以在这句代码中的 res.add(new ArrayList<>(path))将子集合加入到结果集的时候就需要将满足条件的子结果集复制一份再放到最终结果集

      if(path.size() == nums.length) {//递归出口(子结果集大小 = 数组大小 )
        res.add(new ArrayList<>(path));//因为path是实时变化的,必须要将path复制到一个新数组再放到res结果集
        return;
      }

如果我们这样做: res.add(path); ,直接将子结果集放到最终结果集,就会导致加入的子结果集为空,因为path子集合因为会做回溯操作 ,最后肯定加入的就是一个空数组,,满足条件的path只是一个中间状态。

【LeetCode-中等题】46. 全排列,力扣,# 中等题,leetcode,算法,职场和发展文章来源地址https://www.toymoban.com/news/detail-699230.html

class Solution {
    List<List<Integer>> res = new ArrayList<>();//最后的结果集
    public List<List<Integer>> permute(int[] nums) {
      List<Integer> path = new ArrayList<>(); //子结果集
      boolean[] usered = new boolean[nums.length]; //标记数组

      backtrace(nums,path,usered);

      return res;
    }

    public void backtrace(int[] nums ,List<Integer> path ,boolean[] usered){
      if(path.size() == nums.length) {//递归出口(子结果集大小 = 数组大小 )
        res.add(new ArrayList<>(path));//因为path是实时变化的,必须要将path复制到一个新数组再放到res结果集
        return;
      }
      for(int i = 0 ; i < nums.length ; i++){
        if(usered[i]) continue;//如果标志位为true  则直接跳过
        else{
          path.add(nums[i]);//加入子结果集
          usered[i] = true;//将该位置标志位标为true  往下不能取了
          backtrace(nums,path,usered);//往下面继续递归
          usered[i] = false;//某次递归结束后,要回溯回去,就得把之前该的标志位还原
          path.remove(path.size()-1);//某次递归结束后,要回溯回去,当前path应该把递归之前加的元素给剔除掉
        }
      }

    }
}

到了这里,关于【LeetCode-中等题】46. 全排列的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode46全排列(回溯入门)

    这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 难度:中等 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案 示例 1 示例 2 示例 3 在很多刷题文章和书籍中,此题都被用做回溯算法的第一题,可见该题

    2024年02月10日
    浏览(29)
  • LeetCode.46. 全排列(回溯法入门)

    写在前面: 题目链接:LeetCode.46. 全排列 编程语言:C++ 题目难度:中等 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例2: 输入:nums = [0,1] 输出:

    2024年02月06日
    浏览(29)
  • C++ | Leetcode C++题解之第46题全排列

    题目: 题解:

    2024年04月24日
    浏览(32)
  • LeetCode 1079. Letter Tile Possibilities【哈希表,回溯,动态规划,排列组合】中等

    本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,

    2024年02月10日
    浏览(39)
  • 【LeetCode力扣】11. 盛最多水的容器 (中等)

      目录 1、题目介绍 2、解题 2.1、解题思路  2.2、图解说明  2.3、解题代码 原题链接: 11. 盛最多水的容器 - 力扣(LeetCode) 示例 2: 提示: n == height.length 2 = n = 105 0 = height[i] = 104 这道题最优的方法就是用双指针,我们可以用指针 left 和指针 right 分别指向数组 height[ ] 的第一

    2024年02月06日
    浏览(37)
  • 力扣 46. 全排列

    题目来源:https://leetcode.cn/problems/permutations/description/   C++题解: 全排列每一次都需要从第一个元素开始遍历,所以不用ind标记开始元素,都从0开始,但需要一个数组used不断更新哪些元素已经被使用,遍历到使用过的元素跳过即可。

    2024年02月12日
    浏览(26)
  • 【LeetCode算法系列题解】第46~50题

    【题目描述】 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以按 任意顺序 返回答案。 【示例1】 【示例2】 【示例3】 【提示】 1 ≤ n u m s . l e n g t h ≤ 6 1le nums.lengthle 6 1 ≤ n u m s . l e n g t h ≤ 6 − 10 ≤ n u m s [ i ] ≤ 10 -10le nums[i]le 10 − 10 ≤ n u

    2024年02月10日
    浏览(26)
  • 【贪心算法】Leetcode 55. 跳跃游戏【中等】

    给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。 示例 1: 输入 :nums = [2,3,1,1,4] 输出: true 解释 :可以先跳 1 步,从下标

    2024年04月28日
    浏览(33)
  • leetcode--回溯算法.全排列(java)

    leetcode 46 原题链接-- 全排列 题目描述: 给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例1: 输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] 示例2: 输入:nums = [0,1] 输出:[[0,1],[1,0]] 示例3: 输入:nums = [1

    2024年02月08日
    浏览(24)
  • LeetCode_贪心算法_中等_763.划分字母区间

    给你一个字符串 s 。我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。注意,划分结果需要满足:将所有划分结果按顺序连接,得到的字符串仍然是 s。返回一个表示每个字符串片段的长度的列表。 示例 1: 输入:s = “ababcbacadefegdehijhklij” 输出

    2024年02月14日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包