概述
第一次见到这种类型的题目,记录一下。
来看一道题:
“给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。”
示例:
输入: nums = [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]
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rotate-array
看到这道题,我一整个懵住!感谢Leetcode的评论区大佬!
分析如下:
利用反转数组的方法,对于数组的右轮转可以拆分成三个步骤:(以示例为例)
1. 先反转整个数组 [1,2,3,4,5,6,7]->[7,6,5,4,3,2,1]
2. 再反转数组中前k个元素 [7,6,5,4,3,2,1]->[5,6,7,4,3,2,1]
3. 再反转数组中后k到n-1个元素 [5,6,7,4,3,2,1]->[5,6,7,1,2,3,4]
over
这里有一个要注意的点,是k的值。可以发现,n=7时,k取15时候的右轮转和k取1时候的右轮转是一样的效果,所以为了避免多余的运算,需要先k=k%n的操作。
代码:
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
# 右旋转
def reverse(i,j):
while i<j:
nums[i],nums[j]=nums[j],nums[i]
i =i+1
j=j-1
n=len(nums)
k=k%n
reverse(0,n-1) # 反转整个字符串
reverse(0,k-1) # 反转区间为前k的子串
reverse(k,n-1) # 反转区间为k到n-1的子串
#左旋转-反转区间为前k的子串-反转区间为k到n-1的子串-反转整个字符串
最后
以上就是清爽豆芽为你收集整理的3-原地算法(轮转数组)的全部内容,希望文章能够帮你解决3-原地算法(轮转数组)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复