数组旋转

问题:

返回将一维数组向右旋转K个位置的结果。比如,一维数组{1,2,3,4,5},k=2时,返回结果是{4,5,1,2,3}。要求常数级空间复杂度,允许修改原有数组

看到一个比较巧妙的方法,将数组反转三次,第一次反转整个数组,第二次反转数组的前K个数,第三次反转数组剩下的数。

每次反转的时间为O(N)。

例如,

一维数组{1,2,3,4,5},k=2

第一次反转:5,4,3,2,1

第二次反转:4,5,3,2,1

第三次反转:4,5,1,2,3 即为最终结果

代码入下:

int[] rotateK(int[] A,int k){
    if(A==null || k>=A.length) return A;
    reverse(A,0,A.length-1); //反转整个数组
     reverse(A,0,A.length-1); //反转前K个数
     reverse(A,0,A.length-1); //反转剩下的数
    return A;
}

void reverse(int[] A,int start,int end){
    while(start<end){
     int temp = A[start];
     A[start] = A[end];
     A[start] = temp;
     start++;
     end--;
}

}
时间: 2024-10-16 20:30:16

数组旋转的相关文章

算法练习:一维数组旋转

题目描述:求一个一维数组向右旋转K个位置后的结果.比如,一维数组{1, 2, 3, 4, 5},当k = 2时,求得的结果为{4, 5, 1, 2, 3}.要求常数级空间复杂度,允许修改原有数组. 一.使用额外的空间(在不要求常数级空间复杂度的情况下) 这样很简单,使用一个额外的空间,保存原有数组的元素,然后可以错位复制原有数组 元素,即可达到题目的要求.比如数组{1, 2, 3, 4, 5},当k = 2时,先将4,5复制到结果数组,然后将1,2,3复制到结果数组的后面部分. //使用额外空间

C++求有序数组旋转之后的最小数字

//问题是:有一万个员工在公司上班,公司为了统计上班人的年纪分布情况, //请将这一万多的人的年纪进行排序,分析一个比较好的算法. #include <iostream> #include <vector> #include <stdlib.h> #include <string.h> #include <stdio.h> #define _MAX_AGE_ 100 #define _MIN_AGE_ 0 #define _EXIT_ cout&

leetcode 7. 在有序可重复数组旋转后搜索 Search in Rotated Sorted Array II

Search in Rotated Sorted Array II Follow up for "Search in Rotated Sorted Array": What if duplicates are allowed? Would this affect the run-time complexity? How and why? Write a function to determine if a given target is in the array. 解题思路: 本题基于

练习-二维数组旋转

#slist = [[i for i in range(4)] for l in range(8)] # slist = [ # [4, 5, 2, 7], # [8, 7, 4, 2], # [1, 9, 7, 3], # [0, 4, 5, 6], # ] # 4*4 slist = [ [4, 5, 2, 7], [8, 7, 4, 2], [1, 9, 7, 3], [0, 4, 5, 6], [1, 9, 7, 3], ] # 4*5 # slist = [ # [1, 0, 1, 8

day4 二维数组旋转90度

二维数组的旋转其实就是数组里面的元素对调的情况:下面有一个4×4的二维数组,[[0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3], [0, 1, 2, 3]],现在要求把二维数组转化为下列形式,[[0, 0, 0, 0], [1, 1, 1, 1], [2, 2, 2, 2], [3, 3, 3, 3]].下面来看一下流程图: 流程图: 流程图如上面所示,就是进行简单的互换而已,下面我们来用代码实现行列互换: data = [[i for i in range(4)

【Python】将4*4数组旋转90度新数组

需求:将一个4*4的数组90度旋转生成新的4*4数组 原来的4*4数组:[0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3][0, 1, 2, 3]90度旋转后的4*4数组:[0, 0, 0, 0][1, 1, 1, 1][2, 2, 2, 2][3, 3, 3, 3] 图解过程: 第一步: 第二步: 第三步: 代码如下: 1 # 初始化一个4*4的数组 2 array =[ [col for col in range(4)] for row in range(4)] 3 #

[数组]旋转数组

旋转数组起始就是数组元素的循环左移或者循环右移.例如:{3,4,5,1,2}为{1,2,3,4,5}的一个旋转数组.旋转数组是在非降序数组的基础上得到的,所以数组原本应该是有序的. 有序数组到旋转数组 如果真的利用循环左移或者循环右移来实现旋转数组,那么将有大量的元素要移动,所以一个好的方法要尽量的减少数组中元素的移动. 方法: 1.对数组的前部分元素做逆序操作 2.对数组的后部分元素做逆序操作 3.对数组的所有元素整体做逆序操作 逆序操作利用两个指针,一个头指针一个尾指针,都往中间移动,一次交

leetcode 6. 在有序数组旋转后搜索 Search in Rotated Sorted Array

Search in Rotated Sorted Array 难度:Hard Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a target value to search. If found in the array return its index, otherw

算法之二维数组旋转

现在有个二维数组:data=[0,1,2,3],[0,1,2,3],[0,1,2,3],[0,1,2,3],每一行都是[0,1,2,3],要求顺时针旋转90度,变成每一列都是[0,1,2,3]. #首先生成一维数组的语句是: row=[i for i in range(6)] print(row) #运行结果: #[0, 1, 2, 3, 4, 5] #生成二维数组的语句是: data=[[i for i in range(4)] for k in range(4)] for j in data