leetcode_189. 轮转数组

leetcode_189. 轮转数组

题目描述:

给定一个整数数组 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 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

题解--反转数组

如果把这道题当成简单的模拟器, 那情况就会变得比较复杂, 除非使用额外的空间, 将原数组复制一份, 然后循环执行nums[(i + k) %length], 这也不是不行, 只是稍显笨拙.

其实我们可以换个思路, 将原来的数组轮转其实可以用反转数组来实现

  1. 将数组整体反转
  2. 将数组0~k-1反转
  3. 将数组k~length-1反转

我们来证明一下, 假如我们要将下面这个数组轮转3个位置,

我们先将整个数组整体反转

紧接着反转前3个元素

在然后, 反转剩下的元素

看, 是不是很神奇, 我们就真的通过这种方式实现了数组轮转.

原理是什么呢

数组轮转本来就可以看作是直接把数组右边的k个元素直接截下来, 然后插到开头的位置, 但是由与我们这是数组, 不是链表, 不能只移动右边的k个而不动其他的,

这时如果我们让整个数组整体反转, 然后再分别反转前k个, 和后面length - k个, 就等效于直接把后面k个元素拆下来, 插到了开头.

Java

java 复制代码
class Solution {
    public void rotate(int[] nums, int k) {
        int length = nums.length;
        k = k % length;
        reverse(nums, 0, length -1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, length -1);

    }
    public void reverse(int nums[], int l, int r) {
        while (l < r) {
            nums[l] = nums[l] ^ nums[r] ^ (nums[r] = nums[l]);
            l ++;
            r --;
        }
    }
}

c++

cpp 复制代码
class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        int length = nums.size();
        k = k % length;
        reverse(nums, 0, length - 1);
        reverse(nums, 0, k - 1);
        reverse(nums, k, length -1);
    }
    void reverse(vector<int>& nums, int l, int r) {
        while ( l < r) {
            //nums[l] = nums[l] ^ nums[r] ^ (nums[r] = nums[l]);
            swap(nums[l], nums[r]);
            l ++;
            r --;
        }
    }
};
相关推荐
Gorway18 小时前
解析残差网络 (ResNet)
算法
拖拉斯旋风18 小时前
LeetCode 经典算法题解析:优先队列与广度优先搜索的巧妙应用
算法
Wect18 小时前
LeetCode 207. 课程表:两种解法(BFS+DFS)详细解析
前端·算法·typescript
灵感__idea1 天前
Hello 算法:众里寻她千“百度”
前端·javascript·算法
Wect2 天前
LeetCode 130. 被围绕的区域:两种解法详解(BFS/DFS)
前端·算法·typescript
NAGNIP2 天前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
颜酱3 天前
单调栈:从模板到实战
javascript·后端·算法
CoovallyAIHub3 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub3 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉