class No_0189_loop_k:
"""
题干:
https://leetcode.cn/problems/rotate-array/
循环位移数组k位
解析:
题目简单,关键是效率。python切片的翻转操作只是修改索引?, 没有赋值,效率比较高
另外记住这个算法:整体翻转 + 局部翻转
[1, 2, 3, 4, 5]
[5, 4 | 3, 2, 1]
[4, 5 | 1, 2, 3]
"""
@staticmethod
def sol_01_slice(nums, k):
# 使用切片
k %= len(nums) # k值可能大于数组的长度,要取余处理
nums[:k], nums[k:] = nums[-k:], nums[:-k]
@staticmethod
def sol_02_reverse(nums: list, k):
k %= len(nums)
# 整体翻转
nums.reverse()
# 前k个翻转
nums[:k] = nums[:k:-1]
# 后n-k个翻转
nums[k:] = nums[k::-1]
@staticmethod
def sol_03_reverse_def(nums: list, k):
def _reverse(left, right):
"""
自己写翻转函数,和切片的效率做个对比
"""
nonlocal nums
while left < right:
nums[left], nums[right] = nums[right], nums[left]
left += 1
right -= 1
n = len(nums)
k %= n
_reverse(0, n-1)
_reverse(0, k-1)
_reverse(k, n-1)
leetcode练习记录189
最新推荐文章于 2024-06-30 05:57:01 发布