本文主要是介绍leetcode-189 轮转数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、题目描述
给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
输入: 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]
二、题解
1、额外使用数组法
vector::assign是C++标准模板库中的一个函数,它的主要功能是给vector容器重新赋值
会删除vector中的所有元素,并根据用户提供的参数重新填充。vector<int> vec1 = {1, 2, 3, 4, 5};
vector<int> vec2;
vec2.assign(vec1.begin() + 2, vec1.begin() + 5); //3,4,5
vec2.assign(vec1.begin(), vec1.end() - 2); //1,2,3
class Solution {
public:void rotate(vector<int>& nums, int k) {int len = nums.size();vector <int> tmp(len);for (int i = 0; i < len; i++) {tmp[(i + k)%len] = nums[i];}nums.assign(tmp.begin(), tmp.end());return;}
};
2、数组反转法
(1) 寻找规律,发现最终可以通过下面步骤完成:
a. 反转整个数组
b. 反转前 K % len 个数据
c. 反转后 len - K % len 个数据
(2)数组反转需要用到下面函数,这是C++的一个新增函数
#include <algorithm>vector<int> v1 ={1,2,3,4,5,6};
vector<int> v2 ={1,2,3,4,5,6};reverse(v1.begin(), v1.end()); //反转后为 6,5,4,3,2,1
reverse(v2.begin(), v2.begin() + 3); //反转后为 3,2,1, 4,5,6
(3)解决代码
class Solution {
public:void rotate(vector<int>& nums, int k) {int tmp = k % nums.size();if (tmp == 0) {return;}reverse(nums.begin(), nums.end());reverse(nums.begin(), nums.begin() + tmp);reverse(nums.begin() + tmp, nums.end());return;}
};
这篇关于leetcode-189 轮转数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!