2021-07-16 力扣 189题 数组翻转(三种方法)

题目:翻转数组

给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。

  • 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。
  • 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?

例子:

2021-07-16 力扣 189题 数组翻转(三种方法)_第1张图片

方法一:暴力求解

int n = nums.length;
        k %= n; 	//当k>n时从头计算
        for (int i = 0; i < k; i++) { //控制数组移动次数
            int temp = nums[n - 1];	//记录末尾值
            for (int j = n - 1; j > 0; j--) { //数组向后移动一次
                nums[j] = nums[j - 1];
            }
            nums[0] = temp;  //交换头尾
        }
    }
    //时间复杂度O(kn)
    //空间复杂度O(1)

方法二:旋转数组

void reverse(vector<int>& nums, int start , int end){
        int temp;
        while(start < end)
        {
            temp = nums[start];
            nums[start++] = nums[end];
            nums[end--] = temp;
        }
    }
    //翻转数组的函数
    void rotate(vector<int>& nums, int k) {
        int n = nums.size();
        k % = n;//同上
        reverse(nums , 0 , n - 1);//全体反转
        reverse(nums , 0 , k - 1);//前半部分转回
        reverse(nums , k , n - 1);//后半部分转回
    }
    //时间复杂度O(2n) 
    //空间复杂度O(1)

方法三:增加数组

vector<int> a(nums.size());
        for(int i = 0 ; i < nums.size() ; i++)
        {
            a[(i + k) % nums.size()] = nums[i];
        }
        nums.assign(a.begin() , a.end());
    }

你可能感兴趣的:(刷题,leetcode,算法)