zoukankan      html  css  js  c++  java
  • OJ练习36——T189 Rotate Array

    把数组做给定次数的rotate操作。

    rotate一次:即把末尾的元素放到开头,将其他的元素循环右移一个单位。

    【思路】

    1.再开个空间,将末尾的k个元素按从前到后的顺序放在新数组的开头,再将原数组剩下的元素按从前到后的顺序赋给新数组剩下的空间。

    节省了时间复杂度,增加了空间复杂度。

    2.顺向思维,每次处理一次rotate,将最后的元素冒泡到开头。时间复杂度太高。

    3.用交换代替rotate,将数组以K分为两半,前半段做翻转,后半段做翻转,最后整体做翻转,时间复杂度和空间复杂度均为最低。

    【my code】

    void rotate(int nums[], int n, int k) {
            int k1=k%n;
            reverse(nums, 0, n-k1-1);
            reverse(nums, n-k1, n-1);
            reverse(nums, 0, n-1);
        }
        void reverse(int nums[], int l, int h){
            //交换代替翻转
            int temp;
            int mid=(l+h)/2;
            for(int i=l; i<=mid; i++){
                temp=nums[i];
                nums[i]=nums[h-i+l];
                nums[h-i+l]=temp;
            }
        }

    【后记】

    耗时27ms,排名靠前。

    所以说,以前学到的算法还是有用的,不经意就会想起来。

  • 相关阅读:
    增强学习--值迭代
    makefile opencv的案例
    shiro拦截器处理链执行顺序
    HTTP头字段总结
    IntelliJ IDEA上创建Maven Spring MVC项目
    使用deploy命令发布jar到私服仓库nexus
    JAVA设计模式之单例模式
    java基础-I/O系统
    HTTP深入浅出 http请求
    HTTP Header 详解
  • 原文地址:https://www.cnblogs.com/ketchups-notes/p/4466116.html
Copyright © 2011-2022 走看看