news 2026/4/23 16:12:05

华为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/4/23 10:50:01

博物馆文物图像标注:GLM-4.6V-Flash-WEB自动打标签实验

博物馆文物图像标注&#xff1a;GLM-4.6V-Flash-WEB自动打标签实验 在数字博物馆建设加速推进的今天&#xff0c;一个看似简单却长期困扰文博机构的问题浮出水面&#xff1a;如何高效、准确地为成千上万件文物图像打上语义标签&#xff1f;人工标注依赖专家经验&#xff0c;耗时…

作者头像 李华
网站建设 2026/4/23 10:50:17

pythonDjango服装鞋子服商城广告-vue

目录Django服装商城与Vue前端整合摘要项目技术支持论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作Django服装商城与Vue前端整合摘要 技术架构 Django作为后端框架提供RESTful API接口…

作者头像 李华
网站建设 2026/4/23 15:31:06

springboot新冠疫苗接种-vue

目录摘要项目技术支持论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作摘要 基于SpringBoot和Vue的新冠疫苗接种管理系统是一个现代化、高效的信息化平台&#xff0c;旨在优化疫苗接种…

作者头像 李华
网站建设 2026/4/23 12:18:33

AI视频生成工作流开发:从产品拆解到带货视频全流程实现

AI视频生成工作流开发:从产品拆解到带货视频全流程实现 摘要 本文详细阐述了一套完整的AI视频生成工作流开发方案,该系统能够根据产品视频或图片自动拆解并生成9个标准化分镜,支持上传产品白底图进行智能替换,最终生成具备专业带货效果的定制化产品视频。系统基于AI工作流…

作者头像 李华
网站建设 2026/4/23 8:55:03

c#调用GLM-4.6V-Flash-WEB模型DLL封装方法揭秘

C#调用GLM-4.6V-Flash-WEB模型DLL封装方法揭秘 在工业控制软件的调试现场&#xff0c;一位工程师正通过本地Windows客户端上传一张设备仪表盘照片&#xff0c;并输入&#xff1a;“当前读数是否异常&#xff1f;”不到一秒&#xff0c;系统返回&#xff1a;“压力表显示1.8MPa&…

作者头像 李华
网站建设 2026/4/23 10:46:56

5CGTFD7D5F27C7N,高性能计算与高速数据传输芯片 现货库存

型号介绍今天我要向大家介绍的是 Microchip 的一款FPGA 芯片——5CGTFD7D5F27C7N。 它拥有 150K 个逻辑单元和 56,480 个自适应逻辑模块&#xff0c;这意味着它拥有强大的计算能力&#xff0c;可以处理各种复杂的逻辑运算。还拥有 225,920 个寄存器&#xff0c;可以存储大量的数…

作者头像 李华