给一个数组,旋转数组 K 次,K 非负数,如以下
附注:尽量想越多种解法越好,想到之後可否利用空间复杂度 O(1) 完成
Input: nums = [1,2,3,4,5,6,7], k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]
限制式:
1 <= nums.length <= 2 * 104
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
缺点:
很快,但空间复杂度并非 O(1)
class Solution:
def rotate(self, nums, k: int) -> None:
n = len(nums)
# k 取余数,比方说等於n根本不用旋转
k %= n
if k != 0:
# 1
tmp = nums[-k:]
# 2
nums[k:n] = nums[:n - k]
# 3
nums[0:k] = tmp
想法:
1. [1,2,3,4,5,6,7] -> [7, 6, 5, 4, 3, 2, 1]
3. [7, 6, 5, 4, 3, 2, 1] -> [5, 6, 7, 4, 3, 2, 1]
3. [5, 6, 7, 4, 3, 2, 1] -> [5, 6, 7, 1, 2, 3, 4]
所以我们该设计一个可以翻转整个数组的函数
class Solution:
def rotate(self, nums, k: int) -> None:
k %= len(nums)
def reverse(nums, i, j):
while i < j:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j -= 1
reverse(nums, 0, len(nums)-1)
reverse(nums, 0, k-1)
reverse(nums, k, len(nums)-1)
可以把 i 想像成头,j 想像成尾巴,当他们头小於尾时俩俩交换,并各自加减一
# 比方说reverse([1, 2, 3, 4, 5, 6, 7], 0, 3)
# 第一次
[1, 2, 3, 4, 5, 6, 7] -> [4, 2, 3, 1, 5, 6, 7]
# 第二次(注意这次是2跟3交换了)
[4, 2, 3, 1, 5, 6, 7] -> [4, 3, 2, 1, 5, 6, 7]
# 准备第三次时i现在等於2,j现在等於1,因此停止
记得这里 while 的条件最好不要设等於 (建议而已),因为比方说今天数组的长度是奇数,那可能 i += 1、j -= 1,会遇到相同的值(i 会等於 j),当然要看设计这个函数的需求是甚麽。
def reverse(nums, i, j):
while i < j:
nums[i], nums[j] = nums[j], nums[i]
i += 1
j -= 1
<<: G Suite 教育版更名为 Google Workspace for Education,并取消无限制储存空间限制至 100 TB
>>: SQL Server Collation (定序) 设定 - 心得分享
各位前辈好 这个问题困扰我一年多了,真的找不到问题点所以提出 我的问题跟这位很像 我的原先设定是 使...
这是我自己面谈後的反省心得,有些要注意的地方真的是讲到烂了,网路上应该也很多面谈教学,但还是想整理...
Google Static Map API 是将网页上需要的地图画面,以静态地图图片的方式显示。 优...
GCE 如何在GCP上建立,如同以往机房建立Server的实体VM,在GCP上提供了三种方式,其中最...
延续之前的浏览列的实作,这次要增加登入跟注册纽,其实我也还在想这个网站是否需要注册功能,毕竟是私人社...