声明:
今天是第44道题。给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。以下所有代码经过楼主验证都能在LeetCode上执行成功,代码也是借鉴别人的,在文末会附上参考的博客链接,如果侵犯了博主的相关权益,请联系我删除
(手动比心ღ( ´・ᴗ・` ))
正文
题目:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入:[1,2,3,4,5,6,7]
和 k = 3 输出:[5,6,7,1,2,3,4]
解释: 向右旋转 1 步:[7,1,2,3,4,5,6]
向右旋转 2 步:[6,7,1,2,3,4,5]
向右旋转 3 步:[5,6,7,1,2,3,4]
示例 2:
输入:[-1,-100,3,99]
和 k = 2 输出: [3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100]
说明:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
- 要求使用空间复杂度为 O(1) 的原地算法。
解法1。把原问题拆解讨论,k可以大于数组长度,所以对k分情况讨论(见下),提交中击败了99.64% 的用户,代码如下。
- 为0:不作处理
- 小于len(nums):
- 如果数组只包含1个或2个元素,直接逆转
- 如果数组包含至少3个元素,则先把整个数组逆转,再把前k个元素逆转,再把后len(nums)-k个元素逆转,就可以达到预想的效果
- 大于len(nums):用k除len(nums)取余,因为对nums右移len(nums)次数组变回原来的样子,所以实际上只需要右移 k % len(nums) 次即可,取余后操作和第2步一样
class Solution(object):
def rotate(self, nums, k):
"""
:type nums: List[int]
:type k: int
:rtype: void Do not return anything, modify nums in-place instead.
"""
if k == 0:
return
elif k < len(nums):
if len(nums) < 3:
nums.reverse()
else:
nums.reverse()
nums[:k] = reversed(nums[:k])
nums[k:] reversed(nums[k:])
else:
need = k % len(nums) # 取余,因为如果k是len(nums)整数倍的话,变换后仍是其本身
nums.reverse()
nums[:need] = reversed(nums[:need])
nums[need:] reversed(nums[need:])
结尾
解法1:(有个点是自己原创优化的)https://blog.csdn.net/weixin_41043240/article/details/79929171