leetcode 轮转数组 189

Posted 空心菜使者

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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]

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/rotate-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解思路

  • 使用额外的数组进行解决,这里关注一下 vecoter的assign的方法。
  • 使用数组翻转 ,先翻转整个数组,然后翻转前k个,再翻转后面的n-k个

代码

方法一

class Solution 
public:
    void rotate(vector<int>& nums, int k) 
      int n = nums.size();
      vector<int> newNums(n);
      for(int i=0;i<n;i++)
      
          newNums[(i+k)%n] = nums[i];
      
      nums.assign(newNums.begin(),newNums.end());
    
;

方法二

class Solution 
public:
    void reverse(vector<int>& nums,int start,int end)
    
        while(start<end)
        
            swap(nums[start++],nums[end--]);
        
    
    void rotate(vector<int>& nums, int k) 
      int n = nums.size();
      k = k%n;
      reverse(nums,0,n-1);
      reverse(nums,0,k-1);
      reverse(nums,k,n-1);
    
;

leetcode 189. 轮转数组(数组旋转)

题目描述

给你一个数组,将数组中的元素向右轮转 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. 首先一定要注意的问题就是数组旋转数字的个数可能会超过数组的长度,也就是k等于数组长度的时候就相当于没有旋转,所以k一定要对数组长度取余,这是很关键的一步
  2. 先对数组整体逆置
  3. 再对前k个数字和 k+1到数组末尾的数字分别进行逆置

代码

class Solution 
    public void reversal(int[] nums,int start,int end) 
        while (start < end) 
            int tmp = nums[start];
            nums[start] = nums[end];
            nums[end] = tmp;
            start++;
            end--;
        
    
    public void rotate(int[] nums, int k) 
        k = k % nums.length;
        // 整体反转
        reversal(nums,0,nums.length-1);
        // 部分反转
        reversal(nums,0,k-1);
        reversal(nums,k,nums.length-1);
    

题目链接

旋转数组

创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于leetcode 轮转数组 189的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode -面试题17.04.消失的数字 -189.轮转数组

LeetCode 0189. 轮转数组:额外空间 / 原地反转

Leetcode训练算法入门——双指针全刷

Leetcode训练算法入门——双指针全刷

数组旋转 Leetcode#189

前端与算法 leetcode 189. 旋转数组