zoukankan      html  css  js  c++  java
  • [LintCode笔记了解一下]39.恢复旋转排序数组

    思路:

    1.需要O(n)的事件复杂度,所以多次循环不考虑

    2.四步翻转法

      -第一步,找到数组里最小的那个数字,因为是旋转排序数组,所以只要找到某个位置arr[i]>arr[i+1]的话,就找到了那个位置,arr[i+1]就是整个数组里最小的数字

      -第二步,找到最小数字的位置后将index到i的前面的部分的数字翻转,比如[4,5,6,7,1,2,3]为例,翻转[4,5,6,7],则得到[7,6,5,4].

      -第三步,翻转剩下的部分[1,2,3],则变成[3,2,1]

      -第四步,全部翻转,则[7,6,5,4,3,2,1]变成[1,2,3,4,5,6,7]

        void recoverRotatedSortedArray(vector<int> &nums) {  
            // write your code here  
            int pos = 1, len = nums.size();  
            for(;(pos < len) && (nums[pos] >= nums[pos-1]); ++pos);//注意'='号  
            if(pos == len)// iterate一周后发现其实已经是顺序排序 
                return;  
            rotateArray(nums, 0, pos);  
            rotateArray(nums, pos, len);  
            rotateArray(nums, 0, len);  
        }  
        void rotateArray(vector<int> &nums, int begin, int end){  
            for(int i = begin, j = end - 1; i < j; ++i, --j)  
                swap(nums[i], nums[j]);  
        }  
  • 相关阅读:
    有限自动机的构造与识别
    c语言文法
    201506110097-试验一实验报告
    作业9.30
    组合数据类型练习,综合练习
    Python综合基础练习
    linux基本命令
    试述大数据对思维方式的重要影响
    语法分析
    有限自动机的构造与识别
  • 原文地址:https://www.cnblogs.com/otakuhan/p/8598880.html
Copyright © 2011-2022 走看看