news 2026/4/18 6:45:26

华为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/18 5:16:27

Unity 之 设备性能分级与游戏画质设置与设备自动适配指南

Unity 之 设备性能分级与游戏画质设置与设备自动适配指南引言&#xff1a;移动设备性能适配的挑战一、设备分级系统的核心架构1.1 分级枚举与平台识别1.2 硬件信息获取二、设备分级算法深度解析2.1 PC设备分级策略2.2 移动设备分级策略三、画质策略实施与优化3.1 质量预设配置3…

作者头像 李华
网站建设 2026/4/17 7:47:32

对比实测:GLM-4.6V-Flash-WEB vs 其他视觉大模型性能差异

GLM-4.6V-Flash-WEB 为何能在视觉大模型中脱颖而出&#xff1f; 在智能客服、内容审核和教育辅助等场景中&#xff0c;用户不再满足于“你能看到这张图吗&#xff1f;”这种基础能力&#xff0c;而是期待系统能真正理解图像背后的语义关系——比如识别配料表中的添加剂、判断医…

作者头像 李华
网站建设 2026/4/10 7:40:52

基于SpringBoot+Web的小游戏集成网站(源码+lw+部署文档+讲解等)

课题介绍本课题旨在设计并实现一款基于SpringBootWeb的小游戏集成网站&#xff0c;解决小游戏资源分散、用户查找游玩不便、游戏数据无法同步、互动体验匮乏及网站运营管理低效等问题。系统以SpringBoot为核心开发框架构建稳定高效的服务端&#xff0c;结合Web技术搭建友好的前…

作者头像 李华
网站建设 2026/3/28 19:10:38

基于Hadoop的健康饮食推荐系统的设计与实现(源码+论文+部署+安装)

感兴趣的可以先收藏起来&#xff0c;还有在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望可以帮到大家。一、程序背景在信息技术高速发展的当下&#xff0c;大众健康管理意识显著提升&#xff0c;对个性化饮食服…

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

ADB install安装GLM-4.6V-Flash-WEB安卓客户端应用

ADB 安装 GLM-4.6V-Flash-WEB 安卓客户端应用 在移动智能设备日益成为人机交互核心入口的今天&#xff0c;如何将强大的多模态大模型能力“落地”到终端&#xff0c;而不是依赖云端推理&#xff0c;已经成为开发者面临的关键挑战。尤其在隐私敏感、网络受限或需要低延迟响应的场…

作者头像 李华
网站建设 2026/4/18 6:27:46

adb调试工具配合GLM-4.6V-Flash-WEB移动端部署方案

ADB调试工具配合GLM-4.6V-Flash-WEB移动端部署方案 在移动AI应用快速落地的今天&#xff0c;一个普遍存在的难题是&#xff1a;如何让强大的多模态大模型既能在资源受限的边缘设备上稳定运行&#xff0c;又能被高效地远程部署与调试&#xff1f;尤其是在没有图形界面、网络条件…

作者头像 李华