题目:给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

输入: nums = [1,2,3,4,5,6,7], k = 3

输出: [5,6,7,1,2,3,4]


为了解决这个问题,我们需要将数组中的元素向右轮转 k 个位置。其实可以使用多种方法来实现这个目标,但这里提供一种最高效的方法,空间复杂度为 O( 1 ),即通过反转数组的特定部分来实现轮转。

核心思路:

首先,反转整个数组。

然后,反转前 k 个元素。

最后,反转剩余的元素。

为什么能这么做呢?可以观察这个题结果的规律。

对于原数组 [1, 2, 3, 4, 5, 6, 7],结果数组为 [5, 6, 7, 1, 2, 3, 4]

我们先把原数组元素全部反转一遍得到 **[7, 6, 5, 4, 3, 2, 1]**。

然后观察它,发现前K个元素(7, 6, 5)再反转一遍得到(5, 6, 7),剩下的元素(4, 3, 2, 1)再反转一遍得到(1, 2, 3, 4)。

把(5, 6, 7)与(1, 2, 3, 4 )连起来不就是结果数组嘛

我的 Java 代码:

public class Solution {
public void rotate(int[] nums, int k) {
if (nums == null || nums.length == 0) {
return;
} int n = nums.length;
k = k % n; // 处理 k 大于 n 的情况 // 1.反转整个数组
reverse(nums, 0, n - 1);
// 2.反转前 k 个元素
reverse(nums, 0, k - 1);
// 3.反转剩余的元素
reverse(nums, k, n - 1);
} private void reverse(int[] nums, int start, int end) {
while (start < end) {
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}

对于输入 nums = [1, 2, 3, 4, 5, 6, 7] 和 k = 3,程序的运行过程如下:

  1. 反转整个数组:[7, 6, 5, 4, 3, 2, 1]

  2. 反转前 3 个元素:[5, 6, 7, 4, 3, 2, 1]

  3. 反转剩余的元素:[5, 6, 7, 1, 2, 3, 4]

最终,数组变为 [5, 6, 7, 1, 2, 3, 4]

力扣算法189:轮转数组 —— 进阶版:空间复杂度 O(1)的更多相关文章

  1. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  2. 力扣算法——135Candy【H】

    老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分. 你需要按照以下要求,帮助老师给这些孩子分发糖果: 每个孩子至少分配到 1 个糖果.相邻的孩子中,评分高 ...

  3. 【力扣】两个数组的交集 II

    给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2: 输入:nums1 = [4,9,5], nu ...

  4. 力扣算法题—069x的平方根

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4 输出: 2 示例 ...

  5. C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法

    题目: 力扣原题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 给定一个字符串, ...

  6. 力扣算法JS LC 59-螺旋矩阵2,LC 152-乘积最大子数组

    LC 59-螺旋矩阵2 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix . 示例 1: 输入:n = 3输出:[[1,2 ...

  7. 62 (OC)* leetCode 力扣 算法

    1:两数之和 1:两层for循环 2:链表的方式 视频解析 2:两数相加 两数相加 3. 无重复字符的最长子串 给定一个字符串,请找出其中长度最长且不含有重复字符的子串,计算该子串长度 无重复字符的最 ...

  8. 力扣算法:125-验证回文串,131-分割回文串---js

    LC 125-验证回文串 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写. 说明:本题中,我们将空字符串定义为有效的回文串. 注:回文串是正着读和反着读都一样的字符串. ...

  9. 力扣算法题—093复原IP地址

    给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式. 示例: 输入: "25525511135" 输出: ["255.255.11.135", ...

  10. 力扣算法题—060第K个排列

    给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列. 按大小顺序列出所有排列情况,并一一标记,当 n = 3 时, 所有排列如下: "123" "132&qu ...

随机推荐

  1. MFC单文档应用程序引入GDI+

    在MFC中引入GDI+,步骤如下: 1.在需要用到GDI+的文件中添加GDI+文件 1 #include <gdiplus.h> 2 using namespace Gdiplus; 2. ...

  2. 解决更新WIFI驱动后出现网络适配器黄色三角警告

    更新WIFI驱动后出现网络适配器黄色三角警告问题的解决方案 在更新 Intel 无线网卡驱动后,遇到了网络适配器异常的问题,尤其是在曾经安装/卸载过 VMware 的电脑上.本篇文章将详细介绍这个问题 ...

  3. 从Tushare获取历史行情数据

    从Tushare获取历史行情数据,分为两种,一种是后复权(daily_hfq)数据,一种是不复权(daily)数据,获取到的数据存储在MongoDB数据库中,每个集合(collection)中,数据字 ...

  4. React-Native开发鸿蒙NEXT-一次审核闪退的排查思路

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  5. Python中的cls变量

    技术背景 在Python的类型设计中,有时候会遇到一个cls参数.其实cls参数就是一个约定俗成的名称,用其他的名字也能正常运行但不建议这么用.它的作用类似于实例方法中的self参数,代表的是类本身, ...

  6. 「Log」做题记录 2024.1.29-

    \(2024.1.29-2024.2.4\) \(\color{royalblue}{P5903}\) 树上 \(k\) 级祖先模板,长链剖分. \(\color{blueviolet}{CF1009 ...

  7. 关于cc3复现以及绕过思路

    关于cc3复现以及绕过思路 (文章简略许多,可以的话,可以看看之前之前发布的文章) 绕过思路:动态加载字节码绕过Runtime,exec被过滤 在前面两个篇章中我们学习了cc1,cc6和动态加载字节码 ...

  8. Docker拉取镜像时的疑惑

    Docker拉取镜像时的疑惑 不知道你在拉取镜像的时候会不会有这样的疑惑--我不是只拉取了一个镜像嘛,为什么会出现这么多的东西 Docker中Layer(层)的概念 在 Docker 中,镜像(Ima ...

  9. `.NC`文件的读取与使用

    .NC文件的读取与使用 前言 NetCDF(network Common Data Form)网络通用数据格式是一种面向数组型并适于网络共享的数据的描述和编码标准.目前,NetCDF广泛应用于大气科学 ...

  10. 二、第一个微信小程序

    使用微信开发者工具创建一个新的空项目,即是一个显示自己账号的小程序. 也可以删除自动生成的冗余代码,手动写一个显示自己账号的简单小程序. 下面即是基于JavaScript模板的手工写的一个简单小程序. ...