C#LeetCode刷题之#189-旋转数组(Rotate Array)
问题
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3700 访问。
给定一个数组,将数组中的元素向右移动 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]
输入: [-1,-100,3,99] 和 k = 2
输出: [3,99,-1,-100]
解释:
向右旋转 1 步: [99,-1,-100,3]
向右旋转 2 步: [3,99,-1,-100]
说明:
- 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
 - 要求使用空间复杂度为 O(1) 的原地算法。
 
Given an array, rotate the array to the right by k steps, where k is non-negative.
Input: [1,2,3,4,5,6,7] and k = 3
Output: [5,6,7,1,2,3,4]
Explanation:
rotate 1 steps to the right: [7,1,2,3,4,5,6]
rotate 2 steps to the right: [6,7,1,2,3,4,5]
rotate 3 steps to the right: [5,6,7,1,2,3,4]
Input: [-1,-100,3,99] and k = 2
Output: [3,99,-1,-100]
Explanation:
rotate 1 steps to the right: [99,-1,-100,3]
rotate 2 steps to the right: [3,99,-1,-100]
Note:
- Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
 - Could you do it in-place with O(1) extra space?
 
示例
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3700 访问。
public class Program {
    public static void Main(string[] args) {
        int[] nums = null;
        //[1,2,3,4,5,6,7] k = 3
        //第1次,反转尾部,1,2,3,4,7,6,5
        //第2次,反转头部,4,3,2,1,7,6,5
        //第3次,反转所有,5,6,7,1,2,3,4
        nums = new int[] { 1, 2, 3, 4, 5, 6, 7 };
        Rotate(nums, 3);
        ShowArray(nums);
        nums = new int[] { 1, 2, 3, 4, 5, 6, 7 };
        Rotate2(nums, 3);
        ShowArray(nums);
        nums = new int[] { 1, 2, 3, 4, 5, 6, 7 };
        Rotate3(nums, 3);
        ShowArray(nums);
        Console.ReadKey();
    }
    private static void ShowArray(int[] array) {
        foreach(var num in array) {
            Console.Write($"{num} ");
        }
        Console.WriteLine();
    }
    private static void Rotate(int[] nums, int k) {
        int[] newNums = new int[k];
        int length = nums.Length;
        k %= length;
        int mid = length - k;
        for(int i = 0; i < k; i++) {
            newNums[i] = nums[mid + i];
        }
        for(int i = mid - 1; i >= 0; i--) {
            nums[i + k] = nums[i];
        }
        for(int i = 0; i < k; i++) {
            nums[i] = newNums[i];
        }
    }
    private static void Reverse(int[] array, int index, int length) {
        for(int i = index, count = -1; i < index + length / 2; i++) {
            count++;
            int t = array[i];
            array[i] = array[index + length - count - 1];
            array[index + length - count - 1] = t;
        }
    }
    private static void Rotate2(int[] nums, int k) {
        if(nums.Length == 1 || k == 0) {
            return;
        }
        k %= nums.Length;
        Reverse(nums, nums.Length - k, k);
        Reverse(nums, 0, nums.Length - k);
        Reverse(nums, 0, nums.Length);
    }
    private static void Rotate3(int[] nums, int k) {
        if(nums.Length == 1 || k == 0) {
            return;
        }
        k %= nums.Length;
        Array.Reverse(nums, nums.Length - k, k);
        Array.Reverse(nums, 0, nums.Length - k);
        Array.Reverse(nums);
    }
}
以上给出3种算法实现,以下是这个案例的输出结果:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3700 访问。
5 6 7 1 2 3 4
5 6 7 1 2 3 4
5 6 7 1 2 3 4
分析:
显而易见,Rotate和Rotate2的时间复杂度均为:  ,Rotate的空间复杂度为: 
 ,Rotate2的空间复杂度为:
  。Rotate3的时间和空间复杂度基于运行时所使用的反转算法。
Rotate2的解法符合题目“原地打转”要求。
C#LeetCode刷题之#189-旋转数组(Rotate Array)的更多相关文章
- LeetCode 189. 旋转数组(Rotate Array)
		
189. 旋转数组 LeetCode189. Rotate Array 题目描述 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. 示例 1: 输入: [1,2,3,4,5,6, ...
 - LeetCode 189:旋转数组 Rotate Array
		
公众号:爱写bug(ID:icodebugs) 给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数. Given an array, rotate the array to the ...
 - LeetCode刷题--26.删除排序数组中的重复项(简单)
		
题目描述 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度.不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成. 示例 ...
 - C#LeetCode刷题之#34-在排序数组中查找元素的第一个和最后一个位置(Find First and Last Position of Element in Sorted Array)
		
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4970 访问. 给定一个按照升序排列的整数数组 nums,和一个目 ...
 - C#LeetCode刷题之#350-两个数组的交集 II(Intersection of Two Arrays II)
		
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4044 访问. 给定两个数组,编写一个函数来计算它们的交集. 输入 ...
 - C#LeetCode刷题之#349-两个数组的交集(Intersection of Two Arrays)
		
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4042 访问. 给定两个数组,编写一个函数来计算它们的交集. 输入 ...
 - C#LeetCode刷题之#724-寻找数组的中心索引( Find Pivot Index)
		
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3742 访问. 给定一个整数类型的数组 nums,请编写一个能够返 ...
 - leetcode刷题-80.删除排序数组中的重复项 II
		
题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...
 - leetCode刷题(找到两个数组拼接后的中间数)
		
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
 
随机推荐
- 04 CMD规范基础使用详解
			
CMD模块规范 1.1 CMD规范说明 专门用于浏览器端,并且模块的加载是异步的,而且只有模块使用时才会加载执行: CMD规范的语法类似于Commonjs + AMD --定义模块使用AMD语法,暴露 ...
 - 发布一个自己做的图片转Base64的软件,Markdown写文章时能用到
			
markdownpic 介绍 Markdown编辑时图片生成base64 软件架构 使用了.netcore winform框架 安装教程 直接运行即可 使用说明 拖拽图片文件 双击选择文件 复制粘贴图 ...
 - DJANGO-天天生鲜项目从0到1-005-FastDFS与Nginx打造自定义文件存储系统
			
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
 - jmeter接口测试 -- 设置跨线程组的全局变量
			
一.操作步骤 1.先提取被设置的变量 2.再用 [线程组] - [后置处理] - [BeanShell PostProcessor]来设置跨线程的全局变量:${__setProperty(新变量名,$ ...
 - 删除表中重复数据,只删除重复数据中ID最小的
			
delete t_xxx_user where recid in ( select recid from t_xxx_user where recid in ( select min(recid) f ...
 - 数据库事务的四个特性ACID
			
原子性[Atomicity] 原子性指的指的就是这个操作,要么全部成功,要么全部失败回滚.不存在其他的情况. 一致性(Consistency) 一致性是指事务必须使数据库从一个一致性状态变换到另一个一 ...
 - Arch Linux, 无法启动进入sddm登录
			
启动Arch Linux 的时候全屏就一个错误"Failed to start Load/Save Screen Backlight Brightness of backlight:acpi ...
 - C#怎么统计网站当前在线人数
			
1.问题背景 c#网站怎么合理的统计在线人数?我想通过全局变量来统计软件的使用情况,当启动软件时向服务器的用户表写开始使用时间,正常退出时写一个结束使用时间,来统计用户的在线使用情况. 但是有一个问题 ...
 - 微服务迁移记(五):WEB层搭建(1)
			
WEB层是最终表现层,注册至注册中心,引用接口层(不需要引用实现层).公共服务层.用户登录使用SpringSecurity,Session保存在redis中,权限管理没有用SpringSecurity ...
 - Day15_阿里短信
			
学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 1.开通 ...