LeetCode.189(轮转数组)
发布人:shili8
发布时间:2025-03-07 08:43
阅读次数:0
**LeetCode189: Rotate Array**
### 题目描述给定一个长度为 n 的整数数组 `nums`,以及一个目标角度 `k`(表示旋转的次数),要求将数组旋转 k 次,并返回旋转后的数组。
### 示例* 输入:`nums = [1,2,3,4,5,6,7]`, `k =3`
输出:`[5,6,7,1,2,3,4]`
* 输入:`nums = [-1,-100,3,99]`, `k =2`
输出:`[-100,3,99,-1]`
### 解决方案#### 方法一:使用额外的空间我们可以先将数组复制到一个新的数组中,然后在新数组中进行旋转。这种方法虽然简单,但需要额外的空间。
class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ n = len(nums) # 将数组复制到一个新的数组中 new_nums = [0] * n for i in range(n): new_nums[(i + k) % n] = nums[i] # 将新数组的元素覆盖到原数组中 for i in range(n): nums[i] = new_nums[i]
#### 方法二:使用反转我们可以先将数组分成两部分,然后分别进行反转。这种方法不需要额外的空间。
class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ n = len(nums) # 将数组分成两部分,然后分别进行反转 left =0 right = n -1 while left < right: # 反转左半部分 nums[left], nums[right] = nums[right], nums[left] left +=1 right -=1 # 如果 k > n/2,则需要反转整个数组 if k > n //2: left =0 right = n -1 while left < right: # 反转右半部分 nums[left], nums[right] = nums[right], nums[left] left +=1 right -=1 # 如果 k > n,则需要反转整个数组两次 if k > n: self.rotate(nums, k % n)
#### 方法三:使用模运算我们可以直接将旋转的次数用模运算来表示,然后进行旋转。
class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ n = len(nums) # 将旋转的次数用模运算来表示 k %= n # 将数组分成两部分,然后分别进行反转 left =0 right = n -1 while left < right: # 反转左半部分 nums[left], nums[right] = nums[right], nums[left] left +=1 right -=1 # 如果 k > n/2,则需要反转整个数组 if k > n //2: left =0 right = n -1 while left < right: # 反转右半部分 nums[left], nums[right] = nums[right], nums[left] left +=1 right -=1 # 如果 k > n,则需要反转整个数组两次 if k > n: self.rotate(nums, k % n)
### 总结本题目要求将一个长度为 n 的整数数组旋转 k 次,并返回旋转后的数组。我们可以使用额外的空间、反转或模运算来解决这个问题。其中,方法一使用额外的空间是最简单的,但需要额外的空间;方法二使用反转是不需要额外空间的,但需要进行两次反转;方法三使用模运算是最直接的,但需要进行两次反转。
### 最终答案最终答案是:
class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ n = len(nums) # 将旋转的次数用模运算来表示 k %= n # 将数组分成两部分,然后分别进行反转 left =0 right = n -1 while left < right: # 反转左半部分 nums[left], nums[right] = nums[right], nums[left] left +=1 right -=1 # 如果 k > n/2,则需要反转整个数组 if k > n //2: left =0 right = n -1 while left < right: # 反转右半部分 nums[left], nums[right] = nums[right], nums[left] left +=1 right -=1 # 如果 k > n,则需要反转整个数组两次 if k > n: self.rotate(nums, k % n)