LeetCode下一个排列问题:变量值正确但输出异常求助
解决LeetCode 31题「下一个排列」原地修改失效的问题
你遇到的核心问题是没有真正对传入的nums列表做原地修改——不管是递归还是循环实现,你都通过nums=xxx的方式给函数内的局部变量nums重新赋值了新的列表对象,但LeetCode平台检测的是最初传入的那个原始列表的状态,你的修改根本没作用在原始列表上,所以平台输出不对。
问题细节分析
- 递归代码里,
recur函数返回新列表后,你执行nums=recur(...),这只是让函数内的nums变量指向了新列表,和LeetCode传入的原始列表完全是两个独立的对象,原始列表的元素没有任何变化。 - 循环代码里,
nums=nums[:n-x]+a同样是创建新列表并赋值给局部变量,后续的nums.sort()也只是给新列表排序,原始列表依然没被改动。
Python里列表是可变对象,但赋值操作不会修改原对象,只会改变变量的引用指向,这是你代码失效的关键。
正确的原地修改思路
要让LeetCode识别到修改,必须直接操作原始列表的元素,比如用切片替换、交换元素、反转片段等方式,绝对不能重新给nums变量赋值新列表。
下一个排列的标准原地实现步骤是:
- 从后往前遍历,找到第一个满足
nums[i] < nums[i+1]的索引i(这个位置是可以提升的最小高位) - 如果找不到i(说明当前是最大排列),直接反转整个列表得到最小排列
- 找到i后,从后往前找第一个比
nums[i]大的元素索引j - 交换
nums[i]和nums[j] - 反转i+1到列表末尾的部分,让这部分成为最小的递增序列,得到下一个排列
修正后的代码
class Solution: def nextPermutation(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ # 步骤1:找第一个升序的位置i i = len(nums) - 2 while i >= 0 and nums[i] >= nums[i + 1]: i -= 1 # 步骤2:找到i后,找j并交换 if i >= 0: j = len(nums) - 1 while nums[j] <= nums[i]: j -= 1 nums[i], nums[j] = nums[j], nums[i] # 步骤3:反转i+1到末尾,得到最小递增后缀 left, right = i + 1, len(nums) - 1 while left < right: nums[left], nums[right] = nums[right], nums[left] left += 1 right -= 1
这段代码所有操作都是直接修改原始列表的元素,没有重新赋值nums变量,完全符合LeetCode的原地修改要求。
内容的提问来源于stack exchange,提问作者Hiya
相关产品推荐
相关产品推荐

