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. C#通用模块专题

    开源 程序设计 常用组件 加载图片,播放音乐.视频,摄像头拍照 文件读写(txt.xml.自定义文件格式(后缀名)) 串口通信 稳定的串口读写:http://blog.csdn.net/kolvin2 ...

  2. Python数据分析 EPD

    参考用书 <利用Python进行技术分析:Python for Data Analysis> 官方把epd (https://www.enthought.com/products/cano ...

  3. ubuntu 12.04的源更新

    apt-get install vim 安装vim vim /etc/apt/sources.list deb http://mirrors.163.com/ubuntu/ precise main ...

  4. MSComm 串口

    MSComm 串口 http://www.docin.com/p-761416611.html http://blog.sina.com.cn/s/blog_50cfd0fc0102v27p.html

  5. xcode添加build phase

    [xcode添加build phase] xcode版本:5.0.2,找了半天,终于找到add build phase的方法,如下图.

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

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

  7. win7安装linux双系统

    整体流程大概就是下载启动盘制作工具以及linux镜像,这些步骤网上很多,我就不再重复了 这里以centos举例说几个我踩到的坑吧 1.选择开始安装后提示 Warning: /dev/root does ...

  8. MAT(Memory Analyzer tool)使用

    当线上环境出现OOM/内存泄漏了,怎么办? 让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,配置-XX:+HeapDumpOnOutOfMemoryError, 当出现OOM时,分析dum ...

  9. 面试题:Java开发中的23种设计模式详解(转)

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  10. ShopNc登录