Skip to content

Commit bd0116a

Browse files
committed
python3/ADD: 189.旋转数组.py
双指针、数组、数学
1 parent 4ac9ebf commit bd0116a

File tree

1 file changed

+101
-0
lines changed

1 file changed

+101
-0
lines changed

python3/189.旋转数组.py

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
#! /usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# vim:fenc=utf-8
4+
#
5+
# Created by m on 2021-09-11
6+
#
7+
8+
"""
9+
10+
"""
11+
12+
from typing import List
13+
14+
15+
class Solution:
16+
def rotate(self, nums: List[int], k: int) -> None:
17+
"""
18+
Do not return anything, modify nums in-place instead.
19+
"""
20+
# 分成两个部分,后一部分整体往前移动,前一部分整体拷贝到后面
21+
# 前面一部分的index是[0, l - 1 - k] 或者说 [0, l - k),或者说,长度是l-k, 那后一部分就是 [1-k, l)了,或者说长度是K
22+
23+
# 空间复杂度O(1),时间复杂度O(n)
24+
l = len(nums)
25+
k %= l
26+
27+
start_index = 0
28+
pre_index = start_index
29+
pre_value = nums[pre_index]
30+
swap_counts = 0
31+
while True:
32+
index = (pre_index + k) % l
33+
pre_value, nums[index] = nums[index], pre_value
34+
swap_counts += 1
35+
if swap_counts == l:
36+
break
37+
else:
38+
if index == start_index:
39+
start_index += 1
40+
pre_index = start_index
41+
pre_value = nums[pre_index]
42+
else:
43+
pre_index = index
44+
45+
return
46+
47+
# 空间复杂度O(1), 时间复杂度O(n)
48+
# -->+++> [0, l - k) [l-k, l)
49+
# <+++<-- 翻转一次 [0, k) [k, l) <===========这里的下标很重要
50+
# +++><-- 前面反转
51+
# +++>--> 后面反转
52+
53+
def reverse(nums, start=0, end=None):
54+
# [start, end)
55+
if end is None:
56+
end = len(nums)
57+
lo, hi = start, end - 1
58+
while lo <= hi:
59+
nums[lo], nums[hi] = nums[hi], nums[lo]
60+
lo += 1
61+
hi -= 1
62+
63+
l = len(nums)
64+
k %= l
65+
66+
reverse(nums)
67+
reverse(nums, 0, k)
68+
reverse(nums, k, l)
69+
70+
return
71+
72+
# 空间复杂度O(n),时间复杂度O(n)
73+
l = len(nums)
74+
k %= l
75+
tmp = nums[:l-k][:]
76+
for i in range(l - k, l):
77+
nums[i - (l - k)] = nums[i]
78+
for i in range(k, l):
79+
nums[i] = tmp[i - k]
80+
return
81+
82+
# 空间复杂度O(n),时间复杂度O(n)
83+
l = len(nums)
84+
k %= l
85+
ans = [None] * l
86+
for i, num in enumerate(nums):
87+
ans[(i + k) % l] = num
88+
nums[:] = ans[:]
89+
90+
91+
if __name__ == '__main__':
92+
so = Solution()
93+
nums = [1, 2, 3, 4, 5, 6, 7]
94+
k = 3
95+
nums = [1, 2, 3, 4, 5]
96+
k = 2
97+
# nums = [-1, -100, 3, 99]
98+
# k = 2
99+
so.rotate(nums, k)
100+
print(nums)
101+
pass

0 commit comments

Comments
 (0)