这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
非常感谢你阅读本文~
欢迎【👍点赞】【⭐收藏】【📝评论】~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://juejin.cn/user/2771185768884824/posts 博客原创~
剑指 Offer II 083. 没有重复元素集合的全排列|46. 全排列:
给定一个不含重复数字的整数数组 nums
,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。
样例 1
1 | ini复制代码输入: |
样例 2
1 | lua复制代码输入: |
样例 3
1 | lua复制代码输入: |
提示
- 1 <= nums.length <= 6
- -10 <= nums[i] <= 10
- nums 中的所有整数 互不相同
分析
- 这道算法题采用递归,回溯法比较简单,谁要是非要用循环非递归,二当家的佩服。
- 提示中说每个数字各不相同,那我们全排列就可以考虑成数字所在位置或者说是数组的下标的不同排列,因为数字都不同,所以我们就不必关心每个数字是几了。
- 可以单开辟空间存储中间排列,这样我们需要能判断某个数字是否被选择过,可以用hash表存储当前排列结果,然后去看是否含有当前数字,但是这样似乎比较低效。
- 每个位置的数字都不一样,所以我们直接存储一下某个位置的数字是否被使用即可。
- 可以直接使用一个布尔数组存储访问过的位置,但是提示中说数字个数最多6个,那我们最多用6个二进制位就可以表示所有数字的已使用和未使用,一个 int 型变量足以,我们用这个 int 型变量的二进制位变化,去对应数字的已使用和未使用。
- 也可以直接在原数组用交换的方式模拟排列,每个数字在所有位置上都排一次不就是全排列吗?先轮着放第一个位置,然后轮着放第二个位置,以此类推。
题解
java
不使用交换的方式
1 | java复制代码class Solution { |
使用交换的方式
1 | java复制代码class Solution { |
c
1 | c复制代码/** |
c++
1 | cpp复制代码class Solution { |
python
1 | python复制代码class Solution: |
go
1 | go复制代码func permute(nums []int) [][]int { |
rust
1 | rust复制代码impl Solution { |
原题传送门:https://leetcode-cn.com/problems/VvJkup/
原题传送门:https://leetcode-cn.com/problems/permutations/
本文转载自: 掘金