zoukankan      html  css  js  c++  java
  • 39. 恢复旋转排序数组

    给定一个旋转排序数组,在原地恢复其排序。

    说明

    什么是旋转数组?

    • 比如,原始数组为[1,2,3,4], 则其旋转数组可以是[1,2,3,4], [2,3,4,1], [3,4,1,2], [4,1,2,3]
    样例

    [4, 5, 1, 2, 3] -> [1, 2, 3, 4, 5]

    挑战 

    使用O(1)的额外空间和O(n)时间复杂度

    不管什么解法,找到最小的数都是有必要的

    可以用二分也可以直接遍历,毕竟要求O(n),为了方便直接遍历吧

    然后就有这么几个思路:

    1、把后面接到前面去

    2、把前面接到后面去

    3、前全部倒转,后全部倒转,再整体全部倒转(很有意思)

    对于第一种

     1 void recoverRotatedSortedArray(vector<int> &nums) {
     2     // write your code here
     3     int size = nums.size();
     4     vector<int>::iterator it1, it2;
     5     it1 = nums.begin();
     6     it2 = nums.begin() + 1;
     7     while (*it1<*it2) {
     8         it1++;
     9         it2++;
    10     }
    11     nums.insert(nums.begin(), it2, nums.end());
    12     nums.resize(size);
    13 }

    我很不明白为什么这个解法WA,明明可以在VS2017里面过,望高人解答

    对于第二种

    void recoverRotatedSortedArray(vector<int> &nums) {
        // write your code here
            if(nums[nums.size()-1]>nums[0]){
                return;
            }
            int size = nums.size();
            int index1 = 0, index2 = 1;;
            while (nums[index1]<=nums[index2]) {
                index1++;
                index2++;
            }
            index1 = 0;
            while (index1<index2) {
                nums.push_back(nums[index1++]);
            }
            nums.erase(nums.begin(), nums.begin()+index2);
        }

    我是用这个过的,注意在循环的时候慎用迭代器进行插删,如果明白自己在做什么还是用下标比较稳

    对于第三种写个倒转函数然后调用就可以了,没什么好贴的,实现也很容易。

  • 相关阅读:
    一道面试题引发的对JavaScript类型转换的思考
    微信后台开发第一步:nodeJS+express接入微信后台详细教程
    class命名
    了解真实的『REM』手机屏幕适配
    js刷新框架子页面的七种方法代码
    移动前端开发之viewport的深入理解
    移动web点5像素的秘密
    refactor window_x64微信小程序环境搭建
    JSON API免费接口
    webpack
  • 原文地址:https://www.cnblogs.com/TheLaughingMan/p/8239682.html
Copyright © 2011-2022 走看看