求助:解决Hackerrank中Python左旋转代码超时问题
优化左旋转代码以解决超时问题
你的当前实现时间复杂度为 O(d*n),每次左移一位都要遍历整个数组,当d和n取值较大(比如105级别)时,总操作次数会达到1010,远超时间限制。以下是两种高效优化方案:
方案1:利用Python列表切片(最简洁)
左旋转d位的本质是将数组前d个元素移到末尾,直接用切片操作可以一步完成,时间复杂度O(n),代码极其简洁:
def rotateLeft(d, arr, n): # 处理d大于n的情况,避免不必要的重复旋转 d = d % n return arr[d:] + arr[:d]
方案2:三次反转法(原地修改,空间复杂度O(1))
这是数组旋转的经典算法,通过三次反转操作实现左旋转,同样是**O(n)**时间复杂度,适合要求原地修改的场景:
def reverse(arr, start, end): while start < end: arr[start], arr[end] = arr[end], arr[start] start += 1 end -= 1 def rotateLeft(d, arr, n): d = d % n # 反转前d个元素 reverse(arr, 0, d-1) # 反转剩余的n-d个元素 reverse(arr, d, n-1) # 反转整个数组 reverse(arr, 0, n-1) return arr
关键说明
- 加入
d = d % n是为了处理d >= n的情况,比如数组长度为8时,旋转10次和旋转2次效果完全一致,避免做无用功。 - Python的切片操作是底层优化的C实现,比手动嵌套循环效率高几个数量级;三次反转法则通过原地交换元素,不需要额外开辟存储空间。
内容的提问来源于stack exchange,提问作者Roger
相关产品推荐
相关产品推荐

