网站放到服务器,北京建站工具,wordpress主题哪个最好用,网站建设新报价图片题目描述#xff1a; 给定一个整数数组 nums#xff0c;将数组中的元素向右轮转 k 个位置#xff0c;其中 k 是非负数。 示例 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]
向右轮转 …题目描述 给定一个整数数组 nums将数组中的元素向右轮转 k 个位置其中 k 是非负数。 示例 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] 示例 2: 输入nums [-1,-100,3,99], k 2
输出[3,99,-1,-100]
解释:
向右轮转 1 步: [99,-1,-100,3]
向右轮转 2 步: [3,99,-1,-100] 题解方法
方法一 最简单的方法就是将原数组按顺序遍历将数组元素根据要求放入在一个新数组特定位置上然后将新数组拷贝到原数组中即可。具体而言明确原数组的长度大小n以及需要轮转的k根据取模计算方法将原数组下标为 i 的元素放至新数组下标为 (ik) mod n 的位置。 // 核心代码 即遍历并复制元素到新的数组中for(int i 0; i n; i){arr[(ik)%n] nums[i];}
力扣运行完整代码
class Solution {
public:void rotate(vectorint nums, int k) {int n nums.size();vectorint arr(n);for(int i 0; i n; i){arr[(ik)%n] nums[i];}nums.assign(arr.begin(), arr.end());}
};
执行用时 方法二 根据题目需要将数组的元k次后尾部 k mod n 个元素会移动至数组头部数组剩余元素也会向后移动 k mod n个位置。 通过将数组翻转的方法可以实现元素的k次移动。第一步将数组所有元素翻转这样可以实现将尾部的 k mod n个元素就被移至数组头部第二步再翻转 [0, k mod n−1]区间的元素和 [k mod n,n−1]区间的元素。最后得到答案。 class Solution {
public:void reverse(vectorint nums, int start, int end){while(start end){//通过调用交换函数实现数组中的前后两两元素交换。swap(nums[start], nums[end]);start 1; //start从数组前面开始遍历end -1; //end从数组后面开始遍历}}void rotate(vectorint nums, int k) {k % nums.size();reverse(nums,0,nums.size()-1);reverse(nums, 0 ,k -1);reverse(nums,k , nums.size()-1);}
};
执行用时 总结 解题方法不唯一。本题可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗欢迎评论区留言哦