leetcode每日一题——189.轮转数组(面试经典150题)

这篇具有很好参考价值的文章主要介绍了leetcode每日一题——189.轮转数组(面试经典150题)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、题目描述与要求

189. 轮转数组 - 力扣(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 <= nums.length <= 105
  • -231 <= nums[i] <= 231 - 1
  • 0 <= k <= 105

二、解题思路

总的思路:

       对题目进行分析可知,我们需要根据轮转量k,将数组后面的k个元素按照原来的顺序放到前面去,而原本前面的元素则按顺序往后移动。例如k=1,数组元素为1234567,那么轮转后的结果应改为5671234。

       要实现这一过程,首先最简单的就是直接利用另一个数组,将原本数组里面的元素按照轮转后的顺序存放到辅助数组里面,然后再将辅助数组的值赋值给数组即可。其中元素轮转后所对应的位置可以由(i+k)%numsSize得到。这一方法的时间复杂度为O(n),空间复杂度也为O(n)。有没有办法能够减少所利用的空间复杂度呢?因为当数组元素过大时,就需要很大的辅助空间。

       我们观察1234  567和567  1234,可以发现轮转相当于根据k的值把数组后面k个元素放到前面,因此我们也可以直接把这个数组分成两部分,分成两部分后怎么让它按照对应的顺序呢,很显然先分成两部分是很难实现排成对应的顺序。那我们想,后面k个元素是要放到前面的,而前面的元素要放到后面去,那我们不如直接先将数组进行翻转,也就是变成“逆序”。然后再把数组分成两部分,此时每一部分所包含的元素是正确的,只是顺序不正确,因为我们对其进行了一次翻转排序,因而只需要分别对两部分再次进行翻转即可。

具体步骤:

利用辅助数组:

①定义辅助数组

②按目标为辅助数组赋值

③利用辅助数组更新原有数组

数组翻转:【在原数组上进行改动】

①判断轮转量是否大于数组元素,若大于则要取余数(因为没那么多位进行轮转)

②对整个数组进行翻转(利用双指针实现首尾元素交换)

③对翻转后的数组的前k个元素进行翻转

④对翻转后的数组的后半部分进行翻转文章来源地址https://www.toymoban.com/news/detail-526929.html


三、具体代码【C语言】

① 利用辅助数组  【时间O(n)  空间O(n)】

void rotate(int* nums, int numsSize, int k){
    if( k ==0 || numsSize == 1)   return;
    int tem[numsSize];//定义辅助数组
    for(int i=0;i<numsSize;i++){
        tem[(i+k)%numsSize]=nums[i];//在辅助数组中将每一个元素放到对应位置
    }
    for(int i=0;i<numsSize;i++){//复制数组
        nums[i]=tem[i];
    }
}

②数组翻转:【在原数组上进行改动】 【时间O(n)  空间O(1)】

void swap(int* a, int* b) //传址
{
    int t = *a;
    *a = *b;
    *b = t;
}

void reverse(int* nums, int left, int right) //对数组进行翻转
{
    while (left < right) 
    {
        swap(&nums[left], &nums[right]);//将首尾两个数进行交换
        left += 1;
        right -= 1;
    }
}

void rotate(int* nums, int numsSize, int k){
    k%=numsSize;  //避免出现轮转量大于数组元素的情况
    if( k ==0 || numsSize == 1)   return;
    //翻转整个数组
    reverse(nums, 0, numsSize - 1);
    //将翻转后的前面部分变回原始顺序
    reverse(nums, 0, k - 1);
    //将翻转后的后面部分变回原始顺序
    reverse(nums, k, numsSize - 1);
}

到了这里,关于leetcode每日一题——189.轮转数组(面试经典150题)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Leetcode:【189. 轮转数组】

    给定一个整数数组  nums ,将数组中的元素向右轮转  k   个位置,其中  k   是非负数 难度:中等 题目链接:189. 轮转数组 示例 2: 提示: 1 = nums.length = 10^5 -2^31 = nums[i] = 2^31 - 1 0 = k = 10^5 核心思想 : 逆置数组 先逆置全部数组 再把右旋过去的数组逆置一下 最后把剩下部分数

    2024年02月07日
    浏览(29)
  • LeetCode189.轮转数组

     这道题我先用最简单的方法做了一遍,就是先把后面的k个数放到一个数组先存起来,然后从数组的后面开始把前面的第k个数放过来,nums[i]=nums[i-k];然后前k个数就直接拿那个存的数组复制过来,然后就是注意如果knums.length,要把模上nums.length;这个还是比较简单的,时间复杂

    2024年02月10日
    浏览(30)
  • 【LeetCode】189. 轮转数组

    题目链接: https://leetcode.cn/problems/rotate-array/ 📕题目要求: 给定一个整数数组  nums ,将数组中的元素向右轮转  k   个位置,其中  k   是非负数。 尽可能想出更多的解决方案,至少有  三种  不同的方法可以解决这个问题。 你可以使用空间复杂度为  O(1)  的  原地  算法

    2023年04月27日
    浏览(34)
  • 【LeetCode-中等题】189. 轮转数组

    思路:通过,开辟数组 取模运算寻找新位置------ 位置(i+k)mod n =新位置 思路: 1、先全部翻转 2、在根据k 的值 对k-1 的两边区域进行翻转 3、注意 k如果 数组长度 就会出现下标越界,所以需要开始就k对数组长度取模 k %=n

    2024年02月11日
    浏览(32)
  • 【LeetCode】189. 轮转数组 - 双指针

    189. 轮转数组

    2024年02月13日
    浏览(37)
  • 【LeetCode力扣】189 53 轮转数组 | 最大子数组和

    目录 1、189. 轮转数组 1.1、题目介绍 1.2、解题思路 2、53. 最大子数组和 2.1、题目介绍 2.2、解题思路   原题链接: 189. 轮转数组 - 力扣(LeetCode) ​ 示例 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] 向右轮转

    2024年02月08日
    浏览(36)
  • LeetCode150道面试经典题-合并两个有序数组(简单)

    题目: 给你两个按 非递减顺序 排列的整数数组  nums1 和 nums2 ,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。 注意: 最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对

    2024年02月14日
    浏览(44)
  • 力扣经典150题第六题:轮转数组问题

    1. 简介 本篇博客将讨论力扣经典150题中的轮转数组问题。给定一个整数数组 nums ,我们需要将数组中的元素向右轮转 k 个位置。 2. 问题描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,

    2024年04月13日
    浏览(29)
  • (C语言版)力扣(LeetCode)189. 轮转数组官方3种解法分析

    题目链接:轮转数组 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 示例 2: 提示: 1 = nums.length = 105 -231 = nums[i] = 231 - 1 0 = k = 105 进阶: 尽可能想出更多的解决方案,至少有 三种 不同的方法可以解决这个问题。 你可以使用空间复杂度为

    2024年02月05日
    浏览(42)
  • 力扣经典150题第一题:合并两个有序数组

    合并两个有序数组问题详解与解决方法 1. 介绍 在编程面试中,合并两个有序数组是一个经典的问题。它要求将两个有序数组合并为一个新的有序数组。本篇博客将深入讨论这个问题,并提供解决方法。 2. 问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两

    2024年04月23日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包