package normal; /** * @program JavaBooks * @description: 189.旋转数组 * @author: mf * @create: 2019/11/04 15:46 */ import java.util.Arrays; /** * 题目:https://leetcode-cn.com/problems/rotate-array/ * 难度:easy */ /* 输入: [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] 输入: [-1,-100,3,99] 和 k = 2 输出: [3,99,-1,-100] 解释: 向右旋转 1 步: [99,-1,-100,3] 向右旋转 2 步: [3,99,-1,-100] */ public class Rotate { public static void main(String[] args) { int[] nums = {1,2,3,4,5,6,7}; int k = 3; rotate2(nums, k); System.out.println(Arrays.toString(nums)); } // 双重循环 时间复杂度:O(kn) 空间复杂度:O(1) private static void rotate(int[] nums, int k) { int n = nums.length; k %= n; for (int i = 0; i < k; i++) { int temp = nums[n - 1]; for (int j = n - 1; j > 0; j--) { nums[j] = nums[j - 1]; } nums[0] = temp; } } // 翻转 时间复杂度:O(n) 空间复杂度:O(1) private static void rotate2(int[] nums, int k) { int n = nums.length; k %= n; reverse(nums, 0, n - 1); reverse(nums, 0, k - 1); reverse(nums, k, n - 1); } private static void reverse(int[] nums, int start, int end) { while (start < end) { int temp = nums[start]; nums[start++] = nums[end]; nums[end--] = temp; } } }