问题描述:

给定一个数组,将数组中的元素向右移动 个位置,其中 是非负数。

示例 :

输入A数组: [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] 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。要求使用空间复杂度为 O(1) 的原地算法。

问题分析:

将数组中的元素向右移动,并要求空间复杂度为O(1),每移动一次,数组的最后一个元素移动到首位,其余元素均向后移动一位,

以上面的A数组为例,可以将A[6]=7先拿出来,不被向后移动的其他数组元素的值覆盖掉,然后将其余元素向后移动一位,数组变为[A[0],1,2,3,4,5,6],再把

A[6]的值赋给A[0],这样就完成了一次数组的移动,循环上述过程即可。这种方法时间复杂度为O(KN),比较耗时

翻转算法:先将数组整个翻转一遍,将后面的元素移动到了前面,但是这时的元素顺序并不满足要求,需要将索引为[0,k-1],和 [k,n-1]的元素翻转回来

时间复杂度为O(n)

 

以上面的A数组为例:

     [1,2,3,4,5,6,7] --翻转索引为[0,n-1]之间的元素--> [7,6,5,4,3,2,1]
--翻转索引为[0,k-1]之间的元素--> [5,6,7,4,3,2,1]
--翻转索引为[k,n-1]之间的元素--> [5,6,7,1,2,3,4]

JAVA实现:

class Solution {
public void rotate(int[] nums, int k) {
int len=nums.length;
k=k%len;//移动的长度只需要对原数组长度取余即可,当k=len时,数组不变
int temp=0;
if(k==0){}
else{
for(int j=0;j<k;j++){
temp=nums[len-1];//先将数组最后一个元素的值赋给temp
for(int i=len-2;i>=0;i--){
nums[i+1]=nums[i];//剩余数组元素均向右移动一位
}
nums[0]=temp;//数组最后一个元素移动到第一个元素的位置
} }
}
}

class Solution {
//翻转算法
public void rotate(int[] nums, int k) {
int n = nums.length;
k = k%n;
reverse(nums, 0, n - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, n - 1);
} private void reverse(int[] nums, int i, int j) {
while (i< j) {
int temp = nums[i];
nums[i++] = nums[j];
nums[j--] = temp;
}
}
}


Leetcode 数组问题3:旋转数组的更多相关文章

  1. LeetCode初级算法--数组02:旋转数组

    LeetCode初级算法--数组02:旋转数组 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/ ...

  2. [LeetCode] 189. Rotate Array 旋转数组

    Given an array, rotate the array to the right by k steps, where k is non-negative. Example 1: Input: ...

  3. LeetCode初级算法之数组:189 旋转数组

    旋转数组 题目地址:https://leetcode-cn.com/problems/rotate-array/ 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输 ...

  4. [LEETCODE] 初级算法/数组 1.3旋转数组

    原题: 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右 ...

  5. 剑指offer 旋转数组

    class Solution { public: int minNumberInRotateArray(vector<int> rotateArray) { //常规的遍历方法时间是O(N ...

  6. 剑指offer编程题Java实现——面试题8旋转数组的最小数字

    剑指offer面试题8:旋转数组的最小数字 题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1, ...

  7. [LeetCode] 61. Rotate List 旋转链表

    Given a linked list, rotate the list to the right by k places, where k is non-negative. Example 1: I ...

  8. [LeetCode] Rotate Array 旋转数组

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  9. LeetCode 189. Rotate Array (旋转数组)

    Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the array  ...

  10. 【Leetcode】【简单】【189. 旋转数组】【JavaScript】

    189. 旋转数组 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释 ...

随机推荐

  1. Html5_css

    CSS 在标签上设置style属性: background-color: #2459a2; height: 48px; ... 编写css样式: 1. 标签的style属性 2. 写在head里面 s ...

  2. LeetCode(173) Binary Search Tree Iterator

    题目 Implement an iterator over a binary search tree (BST). Your iterator will be initialized with the ...

  3. stm32F4中断分析-HAL库

    详细可以参考: STM32使用HAL库操作外部中断——实战操作 https://www.cnblogs.com/wt88/p/9624103.html /** ******************** ...

  4. poj 2251 三维地图最短路径问题 bfs算法

    题意:给你一个三维地图,然后让你走出去,找到最短路径. 思路:bfs 每个坐标的表示为 x,y,z并且每个点都需要加上时间 t struct node{ int x, y, z; int t;}; b ...

  5. MySQL-状态Waiting on empty queue引申

    MySQL 事件调度器示例演示 我们大家都知道MySQL 事件调度器是在 MySQL 5.1 中新生的一个较为特殊的功能,其可以作为定时任务调度器,来取代部分原先只能用操作系统任务调度器才能完成的定时 ...

  6. CI 分页类的使用

    分页本身很简单,无非就是一个 [limit $offset, $length] 的过程. $length 是每页显示的数据量,这个是固定的.要确定的就只有 $offset了. 在CI中的分页类同样要依 ...

  7. Selenium WebDriver-下拉框断言

    #encoding=utf-8 import unittest import time import chardet from selenium import webdriver class Visi ...

  8. chardet的下载及安装

    1.chardet下载地址 https://pypi.python.org/pypi/chardet/3.0.4#downloads 2.解压至安装路径 D:\Program Files (x86)\ ...

  9. pat 1037

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.”现在,给定 ...

  10. [Err] 1022 - Can't write; duplicate key in table '#sql-1500_26'

        今天用powerdesigner修改了一些外键关系,有两个外键的名字取一样的,忘记改了.然后在用navicat运行sql文件时,报出[Err] 1022 - Can't write; dupl ...