You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode下一个排列问题:变量值正确但输出异常求助

解决LeetCode 31题「下一个排列」原地修改失效的问题

你遇到的核心问题是没有真正对传入的nums列表做原地修改——不管是递归还是循环实现,你都通过nums=xxx的方式给函数内的局部变量nums重新赋值了新的列表对象,但LeetCode平台检测的是最初传入的那个原始列表的状态,你的修改根本没作用在原始列表上,所以平台输出不对。

问题细节分析

  • 递归代码里,recur函数返回新列表后,你执行nums=recur(...),这只是让函数内的nums变量指向了新列表,和LeetCode传入的原始列表完全是两个独立的对象,原始列表的元素没有任何变化。
  • 循环代码里,nums=nums[:n-x]+a同样是创建新列表并赋值给局部变量,后续的nums.sort()也只是给新列表排序,原始列表依然没被改动。

Python里列表是可变对象,但赋值操作不会修改原对象,只会改变变量的引用指向,这是你代码失效的关键。

正确的原地修改思路

要让LeetCode识别到修改,必须直接操作原始列表的元素,比如用切片替换、交换元素、反转片段等方式,绝对不能重新给nums变量赋值新列表。

下一个排列的标准原地实现步骤是:

  1. 从后往前遍历,找到第一个满足nums[i] < nums[i+1]的索引i(这个位置是可以提升的最小高位)
  2. 如果找不到i(说明当前是最大排列),直接反转整个列表得到最小排列
  3. 找到i后,从后往前找第一个比nums[i]大的元素索引j
  4. 交换nums[i]和nums[j]
  5. 反转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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:52:48