我是靠谱客的博主 清爽豆芽,最近开发中收集的这篇文章主要介绍3-原地算法(轮转数组),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

第一次见到这种类型的题目,记录一下。

来看一道题:

“给你一个数组,将数组中的元素向右轮转 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-原地算法(轮转数组)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部