轮转数组-力扣189-Java

目录

一、题目描述

二、运行结果

三、解题思路

四、代码


一、题目描述

给你一个数组,将数组中的元素向右轮转 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]

二、运行结果

 

三、解题思路

假设输入数组共有n个元素,将输入数组分成左右两个子数组,其中,右子数组中包含k个元素,左子数组中包含n-k个元素,然后分别将两个子数组倒置(子数组第一个元素和最后互换……),最后再对整个数组进行倒置,得到的就是轮转数组。

四、代码

class Solution {
    public void rotate(int[] nums, int k) {
        int len = nums.length;  //k的值可能比len大
        if(len == 0)
            return;
        k = k % len;
        int l = 0, r = len -1;
        int index2 = len - k;    //右边子数组的元素个数为k
        int index1 = index2 -1;  //将数组nums分成左右两部分
        
        while(l < index1){       //两个子数组分别倒置
            int tmpnum = nums[index1];
            nums[index1] = nums[l];
            nums[l] = tmpnum;
            l++; index1--;
        }
        while(index2 < r){
            int tmpnum = nums[index2];
            nums[index2] = nums[r];
            nums[r] = tmpnum;
            r--; index2++;
        }
        l = 0; r = len - 1;
        while(l < r){              //整个数组倒置
            int tmpnum = nums[l];
            nums[l] = nums[r];
            nums[r] = tmpnum;
            l++; r--;
        }
    }
}

你可能感兴趣的:(#,力扣-java,java,力扣,数组,轮转)