题解 | #没有重复项数字的全排列#

没有重复项数字的全排列

http://www.nowcoder.com/practice/4bcf3081067a4d028f95acee3ddcd2b1

这一题看着简单但是写起来一下子还找不到思路,看了下题解也无法一下子理解,大家的方法都比较抽象,花了很久才想出直观的解决该题的思路。 解决算法如下所示:

  1. 把第一个元素取出来,记作a;
  2. 递归解决剩下的list的全排列,得到结果为[[...],[...],...,];
  3. 对于得到的结果进行遍历,然后将元素a插入到得到的结果的每一个位置;

举一个具体的例子来说明,对于list num=[1,2,3],首先取出第一个元素设为a=1,然后递归得到[2,3]的全排列为[[2,3],[3,2]],遍历[2,3]的全排列,比如第一个[2,3],把a插入到它的各个位置得到[1,2,3],[2,1,3],[2,3,1],然后在对[3,2]也这样做就搞定了。

但是使用上述的递归方式虽然可以得到全排列,但是依然没法使得得到的全排列按照题目要求的结果输出,因此在将a插入递归返回结果result([[...],[...],...,])的过程中还需要做一些处理。将a插入递归返回结果的算法如下:

  1. 首先将a插入在result每个元素的第0个位置,即list开头,这是因为a是递归结果任意元素的前面的元素,因此输出结果中一定是在开头的;
  2. 按照顺序取出result中的元素,对于result[i],把a按照顺序插入到第1,...,len(result[i])的位置;

本题的关键还是要理清这个递归的逻辑,也就是先拿出第一个元素,然后递归得到剩下元素的全排列,在把第一个元素插入到剩下元素全排列的每个位置去即可。 这样得到的结果就是满足要求的了,代码如下:

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param num int整型一维数组 
# @return int整型二维数组
#
class Solution:
    def permute(self , num) :
        # write code here
        if len(num)==1:
            return [num]
        else:
            a = num[0]
            result = self.permute(num[1:])
            new_result = []
            leng = len(result[0])
            for i in range(len(result)):
                new_result.append([a]+result[i])
            for i in range(len(result)):
                tmp = result[i]
                for j in range(len(tmp)):
                    if j != len(tmp)-1:
                        new_result.append(tmp[:j+1]+[a]+tmp[j+1:])
                    else:
                        new_result.append(tmp+[a])
        return new_result

num = [1,2,3]
print(Solution().permute(num))

全部评论
为什么 测试输出的是 [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
点赞 回复 分享
发布于 2023-03-22 11:15 河南

相关推荐

感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
评论
17
1
分享
正在热议
# 25届秋招总结 #
443459次浏览 4523人参与
# 春招别灰心,我们一人来一句鼓励 #
42266次浏览 539人参与
# 阿里云管培生offer #
120460次浏览 2220人参与
# 地方国企笔面经互助 #
7973次浏览 18人参与
# 同bg的你秋招战况如何? #
77249次浏览 569人参与
# 实习必须要去大厂吗? #
55816次浏览 961人参与
# 北方华创开奖 #
107476次浏览 600人参与
# 虾皮求职进展汇总 #
116395次浏览 887人参与
# 如果你有一天可以担任公司的CEO,你会做哪三件事? #
11702次浏览 289人参与
# 实习,投递多份简历没人回复怎么办 #
2455021次浏览 34861人参与
# 提前批简历挂麻了怎么办 #
149962次浏览 1979人参与
# 在找工作求抱抱 #
906124次浏览 9423人参与
# 如果公司给你放一天假,你会怎么度过? #
4764次浏览 55人参与
# 你投递的公司有几家约面了? #
33209次浏览 188人参与
# 投递实习岗位前的准备 #
1196058次浏览 18550人参与
# 机械人春招想让哪家公司来捞你? #
157650次浏览 2267人参与
# 双非本科求职如何逆袭 #
662406次浏览 7397人参与
# 发工资后,你做的第一件事是什么 #
12808次浏览 62人参与
# 工作中,努力重要还是选择重要? #
35929次浏览 384人参与
# 简历中的项目经历要怎么写? #
86943次浏览 1516人参与
# 参加完秋招的机械人,还参加春招吗? #
20154次浏览 240人参与
# 我的上岸简历长这样 #
452080次浏览 8089人参与
牛客网
牛客企业服务