news 2026/7/2 3:48:52

华为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/6/28 18:00:40

图书馆古籍数字化工程中GLM-4.6V-Flash-WEB的作用探讨

图书馆古籍数字化工程中GLM-4.6V-Flash-WEB的作用探讨 在数字人文浪潮席卷全球的今天&#xff0c;越来越多图书馆面临一个共同难题&#xff1a;如何高效、准确地将尘封千年的古籍转化为可检索、可分析、可传播的数字资源&#xff1f;传统方式依赖人工录入与OCR识别结合&#xf…

作者头像 李华
网站建设 2026/6/28 18:00:42

MyBatisPlus乐观锁机制保障GLM-4.6V-Flash-WEB并发安全

MyBatisPlus乐观锁机制保障GLM-4.6V-Flash-WEB并发安全 在当前AI服务快速落地的浪潮中&#xff0c;视觉大模型如智谱推出的 GLM-4.6V-Flash-WEB 正被广泛应用于图像理解、内容审核和智能问答等Web场景。这类系统通常要求毫秒级响应与高并发处理能力&#xff0c;但鲜有人关注其背…

作者头像 李华
网站建设 2026/6/30 11:19:39

学霸同款2026 AI论文写作软件TOP8:MBA毕业论文高效神器测评

学霸同款2026 AI论文写作软件TOP8&#xff1a;MBA毕业论文高效神器测评 2026年MBA论文写作工具测评&#xff1a;高效与专业并重的选择指南 随着AI技术在学术领域的深度应用&#xff0c;越来越多的MBA学生开始借助智能写作工具提升毕业论文的撰写效率。然而&#xff0c;面对市…

作者头像 李华
网站建设 2026/6/28 18:00:41

基于GLM-4.6V-Flash-WEB的图像问答系统搭建全流程

基于GLM-4.6V-Flash-WEB的图像问答系统搭建全流程 在智能客服、教育辅助和无障碍交互等场景中&#xff0c;用户越来越期待AI不仅能“听懂话”&#xff0c;还能“看懂图”。一张截图、一份作业照片、一段产品说明——如何让机器像人一样快速理解图文信息并给出准确回应&#xff…

作者头像 李华
网站建设 2026/6/28 18:00:40

CAE仿真类型全解析:从单物理场到多场耦合,精准匹配行业应用场景

在科研与工程研发中&#xff0c;CAE&#xff08;计算机辅助工程&#xff09;仿真凭借“低成本、高精准、可重复”的优势&#xff0c;已成为替代传统物理试验的核心工具。然而&#xff0c;CAE并非“万能工具”——不同类型的仿真基于不同的物理模型&#xff0c;解决的问题也截然…

作者头像 李华