news 2026/9/2 4:27:37

华为OD面试手撕真题 - 全排列 (C++ Python JAVA JS GO)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD面试手撕真题 - 全排列 (C++ Python JAVA JS GO)

这道题出现的频率非常高,几个小伙伴都反馈抽到这道题。

题目描述

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

示例一

输入:nums = [1,2,3] 输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例二

输入:nums = [0,1] 输出:[[0,1],[1,0]]

示例三

输入:nums = [1] 输出:[[1]]

提示

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums中的所有整数互不相同

题解

力扣原题链接

思路:递归回溯

  1. 总体思路:有n个位置,每个位置尝试放置不同数,从而达到获取所有排列方式。前面的位置选择的数,后面的位置不能在选择。
  2. 通过1的思路进行拆解
    • 要想每个位置尝试放置不同数:实现很简单,使用循环遍历原数组就行,每个数都尝试放入就行。
    • 要想实现前面的位置选择的数,后面的位置不能在选择。,使用一个bool数组,进行去重就行。
  3. 经过1 2 的逻辑分析之后,接下来就是递归回溯的基本套路实现就行。递归的终止条件为所有位置都已填充数

使用下面代码的时间复杂度为O(n * n!)

c++

class Solution { public: void dfs(vector<int>& nums, vector<int>& path, vector<vector<int>>& res, vector<bool>& visited) { int n = nums.size(); // 全部数字已放入 if (path.size() == n) { res.push_back(path); return ; } for (int i = 0; i < n; i++) { // 已被之前位置选择 if (visited[i]) { continue; } // 递归回溯 path.push_back(nums[i]); visited[i] = true; dfs(nums, path, res, visited); visited[i] = false; path.pop_back(); } } vector<vector<int>> permute(vector<int>& nums) { int n = nums.size(); vector<vector<int>> res; vector<bool> visited(n, false); vector<int> path; dfs(nums, path, res, visited); return res; } };

JAVA

import java.util.*; class Solution { // DFS 生成全排列 private void dfs(int[] nums, List<Integer> path, boolean[] visited, List<List<Integer>> res) { int n = nums.length; // 所有数字都已放入路径 if (path.size() == n) { res.add(new ArrayList<>(path)); return; } for (int i = 0; i < n; i++) { // 已被之前位置选择 if (visited[i]) { continue; } visited[i] = true; path.add(nums[i]); dfs(nums, path, visited, res); // 回溯 path.remove(path.size() - 1); visited[i] = false; } } public List<List<Integer>> permute(int[] nums) { int n = nums.length; List<List<Integer>> res = new ArrayList<>(); boolean[] visited = new boolean[n]; List<Integer> path = new ArrayList<>(); dfs(nums, path, visited, res); return res; } }

Python

fromtypingimportListclassSolution:defpermute(self,nums:List[int])->List[List[int]]:res=[]n=len(nums)visited=[False]*n# DFS 生成全排列defdfs(path):# 所有数字都已放入路径iflen(path)==n:res.append(path[:])returnforiinrange(n):# 已被之前位置选择ifvisited[i]:continuevisited[i]=Truepath.append(nums[i])dfs(path)# 回溯path.pop()visited[i]=Falsedfs([])returnres

JavaScript

varpermute=function(nums){constn=nums.length;constres=[];constvisited=newArray(n).fill(false);constpath=[];// DFS 生成全排列functiondfs(){// 所有数字都已放入路径if(path.length===n){res.push([...path]);return;}for(leti=0;i<n;i++){// 已被之前位置选择if(visited[i])continue;visited[i]=true;path.push(nums[i]);dfs();// 回溯path.pop();visited[i]=false;}}dfs();returnres;};

Go

funcpermute(nums[]int)[][]int{n:=len(nums)res:=make([][]int,0)visited:=make([]bool,n)path:=make([]int,0,n)// DFS 生成全排列vardfsfunc()dfs=func(){// 所有数字都已放入路径iflen(path)==n{tmp:=make([]int,n)copy(tmp,path)res=append(res,tmp)return}fori:=0;i<n;i++{// 已被之前位置选择ifvisited[i]{continue}visited[i]=truepath=append(path,nums[i])dfs()// 回溯path=path[:len(path)-1]visited[i]=false}}dfs()returnres}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/30 2:13:27

CSDN官网广告位投放精准触达GLM-4.6V-Flash-WEB目标用户

GLM-4.6V-Flash-WEB&#xff1a;轻量化多模态模型如何重塑Web端视觉理解 在智能客服自动识别用户截图、电商平台实时解析商品详情图、教育App理解习题配图的今天&#xff0c;图像不再只是“看得见”的内容&#xff0c;而是需要被“读懂”的信息。然而&#xff0c;大多数开发者仍…

作者头像 李华
网站建设 2026/9/3 0:09:06

springboot垃圾回收小程序b22ll-vue

目录 技术架构概述核心功能模块技术亮点环保价值 项目技术支持论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作 技术架构概述 SpringBoot垃圾回收小程序B22LL-Vue采用前后端分离架构。…

作者头像 李华
网站建设 2026/9/3 0:12:18

详解Kmeans聚类算法:原理、实现与应用

引言&#xff1a;在机器学习领域&#xff0c;聚类算法作为无监督学习的核心技术之一&#xff0c;广泛应用于用户分群、图像分割、文本聚类、异常检测等场景。其中Kmeans算法以其简单高效、易于实现的特点&#xff0c;成为最受欢迎的聚类算法之一。本文将从基础概念出发&#xf…

作者头像 李华
网站建设 2026/9/3 0:12:46

Plugin ‘vits_native‘ failed to load because module ‘vits_native‘

Plugin vits_native failed to load because module vits_native解决方法&#xff1a;vs 重新编译后&#xff0c;就报错了&#xff0c;解决方法&#xff0c;把之前编译的dll拷贝过来。比如目录&#xff1a;women003_offline_ws\Plugins\vits_native\Intermediate\Build\Win64\U…

作者头像 李华
网站建设 2026/9/3 0:12:50

ue ‘vits_native’ 插件加载失败 ue ‘xxx’ 插件加载失败

ue vits_native’ 插件加载失败 ue xxx’ 插件加载失败解决方法&#xff1a;vs 重新编译后&#xff0c;就报错了&#xff0c;解决方法&#xff0c;把之前编译的dll拷贝过来。比如目录&#xff1a;women003_offline_ws\Plugins\vits_native\Intermediate\Build\Win64\UnrealEdit…

作者头像 李华
网站建设 2026/9/2 8:39:15

火山引擎AI大模型API限流?本地部署GLM-4.6V-Flash-WEB无限制

火山引擎AI大模型API限流&#xff1f;本地部署GLM-4.6V-Flash-WEB无限制 在当前AI应用快速落地的浪潮中&#xff0c;越来越多企业开始将视觉理解能力嵌入核心业务流程——从电商平台的商品图文解析&#xff0c;到金融场景的身份证件识别&#xff0c;再到医疗影像的辅助判读。然…

作者头像 李华