全排列的 Java 实现

引言

LeetCode 是一个流行的在线判题平台,提供了大量算法题目。其中的第46题"全排列"是一个经典的问题,要求生成一个给定数字的所有可能排列。这个问题可以通过回溯算法来解决。本文将介绍如何使用 Java 解决这个问题。

题目描述

给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

复制代码
输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

问题分析

全排列问题是一个典型的回溯问题。我们需要生成所有可能的数字排列,并且每个排列都是由原序列中的数字组成,但顺序不同。

算法选择

对于全排列问题,回溯算法是非常自然且高效的解决方案。回溯算法的基本思想是:

  1. 从左到右依次选择一个数字放入当前位置。
  2. 固定当前位置的数字,递归地填充下一个位置。
  3. 当所有位置都被填满后,将当前的排列添加到结果中。
  4. 回溯,撤销上一步的选择,为当前位置选择下一个可能的数字。

Java 实现

以下是使用 Java 解决这个问题的代码实现:

java 复制代码
import java.util.ArrayList;
import java.util.List;

public class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        backtrack(nums, result, new ArrayList<>(), nums.length);
        return result;
    }

    private void backtrack(int[] nums, List<List<Integer>> result, List<Integer> tempList, int n) {
        if (tempList.size() == n) {
            result.add(new ArrayList<>(tempList));
            return;
        }
        for (int i = 0; i < n; i++) {
            // 检查是否已经使用过 nums[i]
            if (!tempList.contains(nums[i])) {
                tempList.add(nums[i]);
                backtrack(nums, result, tempList, n);
                tempList.remove(tempList.size() - 1); // 回溯
            }
        }
    }

    public static void main(String[] args) {
        Solution solution = new Solution();
        int[] nums = {1, 2, 3};
        List<List<Integer>> permutes = solution.permute(nums);
        System.out.println(permutes);
    }
}

代码解释

  1. permute 方法 :这是主方法,接收一个整数数组 nums
  2. backtrack 方法 :这是一个递归方法,用于实现回溯算法。
    • nums:原始数字数组。
    • result:存储所有排列的列表。
    • tempList:当前正在构建的排列。
    • n:数组 nums 的长度。
  3. 回溯逻辑 :如果 tempList 的大小等于 n,则将 tempList 添加到结果中。否则,遍历数组 nums,对于每个未使用的数字,将其添加到 tempList 中,并递归调用 backtrack 方法。

结语

通过本文的介绍,你应该已经了解了如何使用 Java 解决 LeetCode 第46题"全排列"。这个问题考查了回溯算法的应用,通过递归和回溯可以有效生成所有可能的排列。希望本文能够帮助你更好地理解和掌握回溯算法。如果你有任何问题或需要进一步的帮助,请随时在评论区提问。


相关推荐
二川bro11 分钟前
模型部署实战:Python结合ONNX与TensorRT
开发语言·python
联系QQ:2769988517 分钟前
电化学与冷启动仿真的赝电容计算及GITT扩散系数研究——阻抗分析拟合与全电池电容器性能评估
开发语言
Croa-vo34 分钟前
Tesla Spring 2026 Co-op 面经:CodeSignal真题解析与通关攻略
java·后端·spring
言言的底层世界41 分钟前
c++中STL容器及算法等
开发语言·c++·经验分享·笔记
C***u17642 分钟前
【springboot】Spring 官方抛弃了 Java 8!新idea如何创建java8项目
java·spring boot·spring
CodeAmaz1 小时前
Spring 事务失效的 8 种常见场景总结
java·spring·事务失效
liu****1 小时前
八.函数递归
c语言·开发语言·数据结构·c++·算法
隔山打牛牛1 小时前
Spring 整合 MyBatis 深度详解(原理 + 实操 + 源码级解析)
java·spring·mybatis
华仔啊1 小时前
SpringBoot 动态菜单权限系统设计的企业级解决方案
java·后端
S***q3771 小时前
Java进阶-在Ubuntu上部署SpringBoot应用
java·spring boot·ubuntu