力扣(C++): 旋轉數組

問題描述

給定一個數組, 將數組中的元素向右移動k個位置, 其中k是非負數

示例1

輸入: [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]

代碼示例:

class Solution {
public:
#if 0
	void rotate(vector<int>& nums, int k) {
		int len = nums.size();
		k %= len;
		vector<int> res(len, 0);
		int j = 0;
		for (int i = len - 1 - k; i < len; ++i)
		{
			res[j++] = nums[i];
		}
		for (int i = 0; i < len - 1 - k; ++i)
		{
			res[j] = nums[i];
			j++;
		}
	}
#elif 0
	void rotate(vector<int>& nums, int k) {
		int len = nums.size();
		k %= len;
		vector<int> tmp;
		tmp = nums;
		for (int i = 0; i < len; ++i)
		{
			tmp[(i + k) % len] = nums[i];
		}
		for (int i = len - 1; i > k - 1; --i)
		{

			nums[i] = nums[i - k];
		}
		for (int i = 0; i < k; ++i)
		{
			nums[i] = tmp[i];
		}
	}
#elif 0
	//時間複雜度較高
	//逐個右移
	void rotate(vector<int>& nums, int k) {
		int len = nums.size();
		int last = nums[len - 1];
		for (int i = 0; i < k; ++i)
		{
			for (int j = len - 1; j > 0; --j)
			{
				nums[j] = nums[j - 1];
			}
			nums[0] = last;
			last = nums[len - 1];
		}
	}
#elif 1
	//數組整體翻轉, 再根據k值分段翻轉
	void reverseArr(vector<int> & num, int left, int right)
	{
		while (left < right)
		{
			int tmp = num[left];
			num[left] = num[right];
			num[right] = tmp;
			left++;
			right--;
		}
	}
	void rotate(vector<int>& nums, int k) {
		int len = nums.size();
		k %= len;
		reverseArr(nums, 0, len - 1);
		reverseArr(nums, 0, k - 1);
		reverseArr(nums, k, len - 1);
	}

#endif
};
發佈了239 篇原創文章 · 獲贊 31 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章