189. 轮转数组--数组--初级算法

链接:189. 轮转数组 - 力扣(LeetCode)

题目描述

        给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。使用空间复杂度为 O(1) 的 原地 算法解决这个问题


示例 1:

输入: nums = [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]

思路提示

        为了将最后k个数字置换到前面,可以采用翻转的思路求解,先翻转整个数组,发现后k个数移动到了前面,但为逆序,于是继续翻转前k个数,同理,剩下的数也为逆序继续翻转,最后实现轮转的效果。

代码实现

class Solution {
public:
    void rotate(vector<int>& nums, int k) {
        k=k%nums.size();//轮转一圈回到原地,取余可以减少执行时间
        reverse(nums,0,nums.size()-1);
        reverse(nums,0,k-1);
        reverse(nums,k,nums.size()-1);
        
    }
    void reverse(vector<int> &nums,int start,int end){
        while(start<end){
            swap(nums[start],nums[end]);//交换函数
            // int a=nums[start];
            // nums[start]=nums[end];
            // nums[end]=a;
            ++start;
            --end;
        }
    }
};

相关知识

1、reverse函数

        在 C++ 中,std::reverse() 是一个算法函数,用于反转某个范围内的元素顺序。该函数可用于反转数组、向量和字符串等可迭代容器。

std::reverse() 函数的声明如下:

template< class BidirIt >
void reverse( BidirIt first, BidirIt last );

其中,BidirIt 是一个迭代器类型,表示可以双向遍历的迭代器。

该函数接受两个参数 first 和 last,表示要反转的元素范围。first 是指向待反转范围的第一个元素的迭代器,last 是指向待反转范围的最后一个元素的下一个位置的迭代器。

2、swap函数

        在 C++ 中,std::swap() 是一个标准库函数,用于交换两个对象的值。它接受两个参数,并通过引用将它们的值进行交换。

std::swap() 函数的声明如下:

template< class T >
void swap( T& a, T& b );

其中,T 是对象的类型。函数接受两个参数 a 和 b,并使用引用将它们的值进行交换。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值