这道题,有很多出错的地方
1. 两个数据的交换,应该是 nums[p], nums[i] = nums[i], nums[p] ,而我一开始用的是 # nums[p]=nums[i] # 这种是错的;
2. range()遍历列表元素,我使用了len+1,而应该是len就可以直接遍历结束;
3. 题目要求返回一个列表(列表中套列表),我只会完成单个求解。
rs.append(nums) [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]
rs.append(nums[:]) [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 2, 1], [3, 1, 2]]
这两者存在差别,python是引用传值。
>>> a = [1,2,3]
>>> b = a # a,b指向同一地址
>>> b[1] = 5
>>> a
[1, 5, 3]
>>> c = a[:] # c重新创建了一个地址
>>> c[1] = 8
>>> a
[1, 5, 3]
>>> c
[1, 8, 3]
解答一(完成全排列,不符合题目要求):
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
n = len(nums)
self.perm(nums,0,n)
def perm(self, nums, p, q):
if p == q:
print(nums)
for i in range(p, q):
# for i in range(p, q+1): 这里一直报错
# 遍历一个数组就是range(0, len(arr))
# 你第一次调用 传入的q是len(n),你要遍历数组 就range(0, q)就行,为啥还要+1?
nums[p], nums[i] = nums[i], nums[p]
# nums[p]=nums[i]
self.perm(nums, p+1, q)
nums[p], nums[i] = nums[i], nums[p]
if __name__ == '__main__':
nums = [1,2,3]
myResult = Solution()
print(myResult.permute(nums))
正确答案:
class Solution(object):
def permute(self, nums):
"""
:type nums: List[int]
:rtype: List[List[int]]
"""
n = len(nums)
rs = []
self.perm(nums,0,n,rs)
print(rs)
def perm(self, nums, p, q, rs):
if p == q:
print(nums)
rs.append(nums[:])
for i in range(p, q):
# for i in range(p, q+1): 这里一直报错
# 遍历一个数组就是range(0, len(arr))
# 你第一次调用 传入的q是len(n),你要遍历数组 就range(0, q)就行,为啥还要+1?
nums[p], nums[i] = nums[i], nums[p]
# nums[p]=nums[i]
self.perm(nums, p+1, q, rs)
nums[p], nums[i] = nums[i], nums[p]
if __name__ == '__main__':
nums = [1,2,3]
myResult = Solution()
myResult.permute([1,2,3])