赞
踩
思维题
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
示例 1:
输入: [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:
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:
尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
要求使用空间复杂度为 O(1) 的 原地 算法。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-array
### 解题思路
固定一个位置,将该位置上元素与其应该存放位置元素进行交换,重复此过程
当产生循环时,固定位置序号加一,继续上一步
一共要交换len-1次(固定位置序号加一时也算一次)
时间:o(n)
空间:o(1)
### 代码
- class Solution {
-
- public void rotate(int[] nums, int k) {
-
- int len = nums.length;
-
- k = k % len;
-
- int cnt = len;
-
- int i = 0, j= k, t = 0;
-
-
-
- //固定交换的位置为i,要交换过去的位置为j,其原位置为t
-
- while (cnt-- != 1){
-
- //不换到原来位置时
-
- if (i != j){
-
- //交换i,j位置数据
-
- int x = nums[i];
-
- nums[i] = nums[j];
-
- nums[j] = x;
-
- t = j;
-
- j = (t + k) % len;
-
- }else {
-
- i++;
-
- t = i;
-
- j = (t + k) % len;
-
- }
-
- }
-
- }
-
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。