LeetCode100-189轮转数组

本文基于各个大佬的文章

上点关注下点赞,明天一定更灿烂!


前言

Python基础好像会了又好像没会,所有我直接开始刷leetcode一边抄样例代码一边学习吧。本系列文章用来记录学习中的思考,写给自己看的,也欢迎大家在评论区指导~

您的每一条评论都会让我更有学习的动力。


一、分析题目

题目在理解上倒是很通俗易懂。

进阶:(原题带的)

  • 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
  • 你可以使用空间复杂度为 O(1)原地算法解决这个问题吗?

二、思路以及代码

既然要我们用尽可能多的方法解答,那么先打暴力吧,嘻嘻

python 复制代码
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        k = k % n  # 处理k大于n的情况
        if k == 0:
            return
    
        # 创建新数组
        rotated = [0] * n
        for i in range(n):
            # 计算每个元素的新位置
            new_pos = (i + k) % n
            rotated[new_pos] = nums[i]
    
        # 复制回原数组
        for i in range(n):
            nums[i] = rotated[i]

上传一下试试。谁懂啊,打暴力选手迎来了春天。

换个思路解答,怎么直接在原数组上操作,也就是不需要借助rotated数组复制呢。

其实右移k个元素相当于把后k个元素移动到最前面,原来的数组再拼接到最后。想要达到类似于滑动这种的想法目前对我来说还是有难度的。不过换一个思路,可以多次反转数组,首先反转整个数,然后反转前k个数,最后反转剩余的数。

python 复制代码
class Solution:
    def rotate(self, nums: List[int], k: int) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        n=len(nums)
        k=k%n
        
        #反转数组从start到end的元素
        def reverse(arr,start,end):
            while start<end:
                arr[start],arr[end]=arr[end],arr[start]
                start+=1
                end-=1
        
        if k==0:
            return 
        else:
            # 第一次反转:反转整个数组
            reverse(nums,0,n-1)
            # 第二次反转:反转前k个元素
            reverse(nums,0,k-1)
            # 第三次反转:反转剩余元素
            reverse(nums,k,n-1)

上传一下,通过了通过了。

暂时没想出来其他解法,看看题解吧。好吧官方题解也是反转法,ok那这个题完结撒花!今天没鸽,有进步,奖励自己个炸鸡吃吃。

三、本题收获

炸鸡


总结

只会打暴力,基础一团糟,明天再学吧老铁,别真学会了。