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 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105

二. 笔者见解

本题在力扣中属于中等难度,推荐使用二分法进行数据位置的翻转处理

1.翻转整个数组的顺序

2.翻转1~k个数据

3.翻转看k~n个数据

三.实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public void rotate(int[] nums, int k) {
//翻转轮数取余数
k = k%nums.length;
//三次翻转
reverse(0,nums.length-1,nums);
reverse(0,k-1,nums);
reverse(k,nums.length-1,nums);


}
public void reverse(int l,int r,int[] nums){//二分翻转
int temp;
while(l<r){
temp = nums[l];
nums[l] = nums[r];
nums[r] = temp;
l++;r--;
}
}
}