• 算法练习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
  • 相关阅读:
    SQL Server 2017 各版本之间的差异
    XILINX FIR IP 详解、Verilog 源码、Vivado 工程
    8 个 Promise 高级用法
    mybatis02
    动态规划:组成目标货币的最少货币数
    软件设计不是CRUD(23):在流式数据处理系统中进行业务抽象落地——详细编码
    DispatcherServlet是如何进行初始化的呢?
    【C++二叉树】进阶OJ题
    Redis 集群搭建教程
    第十四章 配置国家语言支持 (NLS)
  • 原文地址:https://blog.csdn.net/UZDW_/article/details/133433456