leetcode学习笔记3:轮转数组(多次翻转数组思想)
先看题
力扣算法题 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]
解题思路1
最终结果数据[5,6,7,1,2,3,4]分为2部分,
前办部分:[5,6,7]
后半部分:[1,2,3,4]
用一个新数组,将前后2部分数组拼接起来就是结果
//Solution1:新数组存储public static void rotateSolution1(int[] nums, int k) {if (nums.length<=1){return;}if (nums.length<k){k =k% nums.length;}int[] newArray = new int[nums.length];for (int i=0;i<nums.length;i++){if (i<k){newArray[i] = nums[nums.length-k+i]; //前部分}else {newArray[i] = nums[i-k]; //后部分}}}
解题思路2
先将数组整体反转得到
[7,6,5, 4,3,2,1]
再降数组分为2部分,前半部分为:
[7,6,5]
后半部分:
[4,3,2,1]
分别对前后2部分数组进行反转即可得到:
[5,6,7,1,2,3,4]
/*Solution2:原地替换思路:1.数组整体翻转 [7,6,5, 4,3,2,1]2.数组前半段翻转3.数组后半段翻转
* */
public static void rotateSolution2(int[] nums, int k) {if (nums.length<=1){return;}if (nums.length<k){k =k% nums.length;}rotateArray(nums,0,nums.length-1);rotateArray(nums,0,k-1);rotateArray(nums,k,nums.length-1);
}
