news 2026/5/12 8:17:46

华为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/5/3 19:02:21

立足招投标数据,洞察火电转型新格局:从“被动应对”到“主动破局”的战略跃迁‌

立足招投标数据&#xff0c;洞察火电转型新格局&#xff1a;从“被动应对”到“主动破局”的战略跃迁‌《中国能源报》近日联合自然资源保护协会发布的《中国传统发电上市公司低碳转型绩效评价2025》报告&#xff0c;敏锐地指出我国传统发电行业正经历一场深刻的范式转变&#…

作者头像 李华
网站建设 2026/5/1 8:20:14

Vite 极速的服务启动:使用原生 ESM 文件,无需打包

Vite通过原生ESM模块实现极速开发体验&#xff1a;开发环境直接利用浏览器ESM加载能力&#xff0c;按需即时编译单个文件而非整体打包&#xff1b;通过依赖预构建和请求拦截优化性能&#xff1b;生产环境仍采用Rollup打包以确保兼容性和优化。相比传统打包工具&#xff0c;Vite…

作者头像 李华
网站建设 2026/5/1 2:47:00

ADB截屏命令结合GLM-4.6V-Flash-WEB实现手机图像理解

ADB截屏命令结合GLM-4.6V-Flash-WEB实现手机图像理解 在自动化测试工程师的日常工作中&#xff0c;一个常见的挑战是&#xff1a;如何让系统“真正看懂”手机屏幕上正在发生什么。传统UI自动化依赖控件ID、XPath或坐标点击&#xff0c;一旦界面稍有变动&#xff0c;脚本便可能失…

作者头像 李华
网站建设 2026/5/1 13:42:52

DISM++驱动导出功能备份GLM-4.6V-Flash-WEB显卡驱动

DISM驱动导出功能备份GLM-4.6V-Flash-WEB显卡驱动 在人工智能应用加速落地的今天&#xff0c;越来越多开发者面临一个看似“低级”却频繁出现的问题&#xff1a;系统重装后GPU驱动丢失&#xff0c;导致CUDA环境崩溃、PyTorch无法识别显卡——原本几分钟能跑通的模型推理脚本&am…

作者头像 李华
网站建设 2026/5/8 21:17:05

Chromedriver下载地址失效应对策略:GLM-4.6V-Flash-WEB本地化部署

Chromedriver下载地址失效应对策略&#xff1a;GLM-4.6V-Flash-WEB本地化部署 在自动化测试和网页内容抓取的日常开发中&#xff0c;你是否曾因 chromedriver.storage.googleapis.com 访问失败而束手无策&#xff1f;一个看似微不足道的驱动下载链接失效&#xff0c;却可能让整…

作者头像 李华