leetcode189-旋转数组

原题

给定一个数组,将数组中的元素向右移动 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) 的 原地 算法。

解法

思想

将旋转点前后的部分交换。注意当k大于数组大小size的情况相当于k=k%size的情况

代码

解法一:

class Solution {
    public void rotate(int[] nums, int k) {
        int size = nums.length;
        if(k==size) return;
        //k大于size的情况
        if(k>size) k = k%size;
        //用另一个数组暂时存放结果
        int[] rotate = new int[size];
        //将旋转点后面的部分移到新数组前面来
        for(int i = 0;i<k;i++){
            rotate[i] = nums[size-k+i];
        }
        //将旋转点前面的部分移到新数组后面去
        for(int i = k;i<size;i++){
            rotate[i] = nums[i-k];
        }
        //将新数组中的值赋值回原数组
        for(int i = 0;i<size;i++){
            nums[i] = rotate[i];
        }
    }
}

解法二:递归

func rotate(nums []int, k int)  {
    rotateDot := k % len(nums)
    if rotateDot > 0{
        reverse(nums, 0, len(nums) - 1)
        reverse(nums, 0, rotateDot-1)
        reverse(nums, rotateDot, len(nums) - 1)
    }
}

func reverse(nums []int, start, end int) {
    for i:= 0; i <= (end - start)/2; i++{
        nums[start+i], nums[end-i] = nums[end-i], nums[start+i]
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode189-%e6%97%8b%e8%bd%ac%e6%95%b0%e7%bb%84/

(0)
彭晨涛彭晨涛管理者
上一篇 2019年11月20日
下一篇 2019年11月23日

相关推荐

  • leetcode622-设计循环队列

    设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是…

    算法 2019年11月24日
    0130
  • leetcode599-两个列表的最小索引总和

    原题 假设Andy和Doris想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示。 你需要帮助他们用最少的索引和找出他们共同喜爱的餐厅。 如果…

    算法 2019年12月22日
    0120
  • leetcode456-132模式

    原题 给定一个整数序列:a1, a2, ..., an,一个132模式的子序列 ai, aj, ak 被定义为:当 i < j < k 时,ai < ak &lt…

    算法 2020年1月30日
    0150
  • leetcode238-除自身以外数组的乘积

    原题 给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积…

    算法 2020年6月4日
    080
  • leetcode1162-地图分析

    原题 你现在手里有一份大小为 N x N 的『地图』(网格) grid,上面的每个『区域』(单元格)都用 0 和 1 标记好了。其中 0 代表海洋,1 代表陆地,你知道距离陆地区域…

    2020年3月29日
    0170
  • leetcode344-反转字符串

    原题 编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。 不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间…

    算法 2019年11月18日
    0150
  • leetcode557-反转字符串中的单词III

    原题 给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。 示例1: 输入: “Let’s take LeetCode contest” 输出: …

    算法 2019年11月23日
    0120
  • leetcode1114-按序打印

    原题 我们提供了一个类: public class Foo {   public void one() { print("one"); }   public void two() …

    算法 2020年2月1日
    0140
  • leetcode145-二叉树的后序遍历

    原题 给定一个二叉树,返回它的 后序 遍历。 示例: 输入: [1,null,2,3]  1   \    2 &nbs…

    算法 2020年1月10日
    080
  • 剑指offer17-打印从1到最大的n位数

    原题(来源Leetcode) 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: …

    算法 2020年4月17日
    080

发表回复

登录后才能评论