LeetCode100-189轮转数组
本文基于各个大佬的文章
上点关注下点赞,明天一定更灿烂!
前言
Python基础好像会了又好像没会,所有我直接开始刷leetcode一边抄样例代码一边学习吧。本系列文章用来记录学习中的思考,写给自己看的,也欢迎大家在评论区指导~
您的每一条评论都会让我更有学习的动力。
一、分析题目
题目在理解上倒是很通俗易懂。
进阶:(原题带的)
- 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。
- 你可以使用空间复杂度为
O(1)
的 原地 算法解决这个问题吗?
二、思路以及代码
既然要我们用尽可能多的方法解答,那么先打暴力吧,嘻嘻
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] * nfor i in range(n):# 计算每个元素的新位置new_pos = (i + k) % nrotated[new_pos] = nums[i]# 复制回原数组for i in range(n):nums[i] = rotated[i]
上传一下试试。谁懂啊,打暴力选手迎来了春天。
换个思路解答,怎么直接在原数组上操作,也就是不需要借助rotated数组复制呢。
其实右移k个元素相当于把后k个元素移动到最前面,原来的数组再拼接到最后。想要达到类似于滑动这种的想法目前对我来说还是有难度的。不过换一个思路,可以多次反转数组,首先反转整个数,然后反转前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=k%n#反转数组从start到end的元素def reverse(arr,start,end):while start<end:arr[start],arr[end]=arr[end],arr[start]start+=1end-=1if k==0:return else:# 第一次反转:反转整个数组reverse(nums,0,n-1)# 第二次反转:反转前k个元素reverse(nums,0,k-1)# 第三次反转:反转剩余元素reverse(nums,k,n-1)
上传一下,通过了通过了。
暂时没想出来其他解法,看看题解吧。好吧官方题解也是反转法,ok那这个题完结撒花!今天没鸽,有进步,奖励自己个炸鸡吃吃。
三、本题收获
炸鸡
总结
只会打暴力,基础一团糟,明天再学吧老铁,别真学会了。