leecode刷题(3)-- 旋转数组

旋转数组

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

示例:

输入: [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) 的原地算法。

个人理解:

数组的旋转,即把一个数组最开始的若干个元素搬到数组的末尾。

所以我们按照字面意思,来改变数组下标,每次让最后一位数值和前一位数值交换,然后再将最后一位数值赋值为第一位数值,让数组排序。

举个栗子

每旋转一次的执行过程

1) 先将最后一个保存到临时变量
1 2 3 4 5 6 7 8 [8] --- 临时变量
2)位移
_ 1 2 3 4 5 6 7 [8] --- 临时变量
3)将临时变量放到第一个
8 1 2 3 4 5 6 7

代码如下:

public class Rotate {
public static void rotate(int[] nums, int k) {
if (nums == null || k == 0 || k == nums.length) {
return ;
}
// 空间复杂度为 O(1)
int temp = 0;
while (k > 0) {
// 每次将最后一位和前一位数值交换
temp = nums[nums.length - 1];
for (int i = nums.length -2; i >= 0; i--) {
nums[i+1] = nums[i];
}
//每次将最后一位赋值为第一个
nums[0] = temp;
k--;
}
for (int num : nums) {
System.out.print(num + ",");
}
} public static void main(String[] args) {
int[] nums = {-1, -100, 3, 99};
int k = 2;
rotate(nums, k);
}
}

这样子虽然简单,但是在 leecode 提交却提示超出时间限制。。。看一下时间复杂度确实也是,我们的时间复杂度达到了 O(kn) 。确实太大了 .....((/- -)/

然后自己去网上搜了一下其他回答,贴个老哥的代码在这里,我看的不是很懂,用到的思想是取余翻转。

class Solution {
public static void rotate(int[] nums, int k) {
if (nums == null || k == 0 || k == nums.length) {
return;
}
k = k % nums.length;
reverse(nums, 0, nums.length - k - 1);
reverse(nums, nums.length - k, nums.length - 1);
reverse(nums, 0, nums.length - 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;
start++;
end--;
}
}
}

这里的时间复杂度为 O(n), 比原来的 O(kn) 好,执行效率高了挺多。

leecode刷题(3)-- 旋转数组的更多相关文章

  1. leecode刷题(22)-- 反转数组

    leecode刷题(22)-- 反转数组 反转数组 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3-> ...

  2. leecode刷题(6)-- 两个数组的交集II

    leecode刷题(6)-- 两个数组的交集II 两个数组的交集II 描述: 给定两个数组,编写一个函数来计算它们的交集. 示例: 输入: nums1 = [1,2,2,1], nums2 = [2, ...

  3. leecode刷题(4)-- 存在重复数组

    leecode刷题(4)-- 存在重复数组 存在重复数组 题目描述: 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 ...

  4. leecode刷题(10)-- 旋转图像

    leecode刷题(10)-- 旋转图像 旋转图像 描述: 给定一个 n × n 的二维矩阵表示一个图像. 将图像顺时针旋转 90 度. 说明: 你必须在原地旋转图像,这意味着你需要直接修改输入的二维 ...

  5. leecode刷题(19)-- 最长公共前缀

    leecode刷题(19)-- 最长公共前缀 最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入: [&quo ...

  6. leecode刷题(16)-- 字符串转换整数

    leecode刷题(16)-- 字符串转换整数 字符串转换整数 描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格 ...

  7. leecode刷题(12)-- 整数反转

    leecode刷题(12)-- 整数反转 整数反转 描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 输出: 321 示例 2: 输入: - ...

  8. leecode刷题(11)-- 反转字符串

    leecode刷题(11)-- 反转字符串 反转字符串 描述: 编写一个函数,其作用是将输入的字符串反转过来. 示例 1: 输入: "hello" 输出: "olleh& ...

  9. leecode刷题(8)-- 两数之和

    leecode刷题(8)-- 两数之和 两数之和 描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输 ...

随机推荐

  1. php浏览器端调试输出方法

     1.利用js打印到浏览器控制台 <?php function console_log($data) {     if (is_array($data) || is_object($data)) ...

  2. Java之泛型

    1. 概述          在引入泛型之前,Java类型分为原始类型.复杂类型,其中复杂类型分为数组和类.引入泛型后,一个复杂类型就可以在细分成更多的类型.          例如原先的类型List ...

  3. Java面向对象-package import关键字

    Java面向对象-package import关键字 package包关键字,在java中,有包的概念,主要是用来归类 分类作用: 便于项目的开发和维护: 这里截取随便截取一个我最近在开发的一个开源工 ...

  4. delphi 在桌面屏幕上模拟鼠标单击

    delphi 在桌面屏幕上模拟鼠标单击 procedure TFrmUnicom.Button1Click(Sender: TObject); var oldPoint, newPoint: TPoi ...

  5. LibEvent代码阅读--多缓冲区和零拷贝技术

    http://blog.chinaunix.net/uid-20937170-id-4827550.html

  6. bash&nbsp;shell笔记5&nbsp;显示数据

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://twentyfour.blog.51cto.com/945260/521455 知 ...

  7. 缓存数据库redis

    什么是Redis? Redis是一个TCP服务器,支持请求/响应协议. 在Redis中,请求通过以下步骤完成: 客户端向服务器发送查询,并从套接字读取,通常以阻塞的方式,用于服务器响应. 服务器处理命 ...

  8. leetcode:First Missing Positive分析和实现

    题目大意: 传入整数数组nums,求nums中未出现的正整数中的最小值.要求算法在O(n)时间复杂度内实现,并且只能分配常量空间. 分析: 一般碰到这种问题,都先对数组进行排序,再遍历数组就可以找到最 ...

  9. 【bzoj2186】[Sdoi2008]沙拉公主的困惑

    2186: [Sdoi2008]沙拉公主的困惑 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 3303  Solved: 1129[Submit][S ...

  10. Codeforces 1120D (树形DP 或 最小生成树)

    题意看这篇博客:https://blog.csdn.net/dreaming__ldx/article/details/88418543 思路看这篇:https://blog.csdn.net/cor ...