|
| 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