• 算法练习6——旋转数组


    LeetCode 旋转数组

    给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。
    示例 1:
    输入: nums = [1,2,3,4,5,6,7], k = 3
    输出: [5,6,7,1,2,3,4]
    解释:
    向右轮转 1 步: [7,1,2,3,4,5,6]
    向右轮转 2 步: [6,7,1,2,3,4,5]
    向右轮转 3 步: [5,6,7,1,2,3,4]
    示例 2:
    输入:nums = [-1,-100,3,99], k = 2
    输出:[3,99,-1,-100]
    解释:
    向右轮转 1 步: [99,-1,-100,3]
    向右轮转 2 步: [3,99,-1,-100]

    蛮力法

    1. 新开数组
    class Solution:
        def rotate(self, nums: List[int], k: int) -> None:
            """
            Do not return anything, modify nums in-place instead.
            """
            k = k % len(nums)
            k_nums = nums[len(nums) - k:]
            for i in range(len(nums) - k - 1, -1, -1):
                nums[i + k] = nums[i]
            for i in range(k):
                nums[i] = k_nums[i]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    class Solution {
    public:
        void rotate(vector<int>& nums, int k) {
            int n = nums.size();
            vector<int> newArr(n);
            for (int i = 0; i < n; ++i) {
                newArr[(i + k) % n] = nums[i];
            }
            nums.assign(newArr.begin(), newArr.end());
        }
    };
    
    // 作者:力扣官方题解
    // 链接:https://leetcode.cn/problems/rotate-array/
    // 来源:力扣(LeetCode)
    // 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    1. 环状替换
      直接看官方题解

    我写的白给代码

    class Solution:
        def rotate(self, nums: List[int], k: int) -> None:
            """
            Do not return anything, modify nums in-place instead.
            """
            k = k % len(nums)
            pos, val = 0, nums[0]
            while(True):
                next = (pos + len(nums) - k) % len(nums)
                if next != 0:
                    nums[pos] = nums[next]
                    pos = next
                else:
                    nums[pos] = val
                    return
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    1. 数组反转(我怎么就没想到)

    思路:https://leetcode.com/problems/rotate-array/solutions/54250/Easy-to-read-Java-solution/

    nums = "----->-->"; k =3
    result = "-->----->";
    
    reverse "----->-->" we can get "<--<-----"
    reverse "<--" we can get "--><-----"
    reverse "<-----" we can get "-->----->"
    this visualization help me figure it out :)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    class Solution {
    public:
        void reverse(vector<int>& nums, int start, int end) {
            while (start < end) {
                swap(nums[start], nums[end]);
                start += 1;
                end -= 1;
            }
        }
    
        void rotate(vector<int>& nums, int k) {
            k %= nums.size();
            reverse(nums, 0, nums.size() - 1);
            reverse(nums, 0, k - 1);
            reverse(nums, k, nums.size() - 1);
        }
    };
    
    // 作者:力扣官方题解
    // 链接:https://leetcode.cn/problems/rotate-array/
    // 来源:力扣(LeetCode)
    // 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    React - setState 原理
    机器学习中的集成学习
    智能优化算法 | Matlab实现ABC人工蜂群优化算法
    树论_1.
    苹果电脑提高工作效率alfred 5中文
    中尺度混凝土二维有限元求解——运行弯曲、运行光盘、运行比较、运行半圆形(Matlab代码实现)
    C++&qt Day9
    灵性图书馆:好书推荐-《新世界:灵性的觉醒》
    Redis hot key管理
    WordPress主题开发( 十二)之—— 主题的functions.php
  • 原文地址:https://blog.csdn.net/UZDW_/article/details/133433456