【easy】189. Rotate Array
阿新 • • 發佈:2018-02-12
例子 旋轉 標簽 nbsp left null back int return
題目標簽:Array
題目給了我們一個數組 和 k。 讓我們 旋轉數組 k 次。
方法一:
這裏有一個很巧妙的方法:
利用數組的length - k 把數組 分為兩半;
reverse 左邊和右邊的數組;
reverse 總數組。
舉一個例子:
1 2 3 4 5 6 7 如果k = 3 的話, 會變成 5 6 7 1 2 3 4
1 2 3 4 5 6 7 middle = 7 - 3 = 4,分為左邊 4個數字,右邊 3個數字
4 3 2 1 7 6 5 分別把左右reverse 一下
5 6 7 1 2 3 4 把總數組reverse 一下就會得到答案
public class Solution { public void rotate(int[] nums, int k) { if(nums == null || nums.length == 0 || k % nums.length == 0) return; int turns = k % nums.length; int middle = nums.length - turns; reverse(nums, 0, middle-1); // reverse left partreverse(nums, middle, nums.length-1); // reverse right part reverse(nums, 0, nums.length-1); // reverse whole part } public void reverse(int[] arr, int s, int e) { while(s < e) { int temp = arr[s]; arr[s] = arr[e]; arr[e]= temp; s++; e--; } } }
-----------------------------
方法二:
class Solution { public: void rotate(vector<int>& nums, int k) { //方法一:另設置一個vector,然後逐個元素添加進去,最後將這個vector賦值給nums。添加方式為將右邊的k個元素添加進去,再將左邊的n-k個元素添加進去。 if (nums.size() == 1) return; if (k > nums.size()) k %= nums.size(); vector<int> newNums; for (int i = nums.size() - k; i < nums.size(); ++i) newNums.push_back(nums[i]); for (int i = 0; i < nums.size() - k; ++i) newNums.push_back(nums[i]); nums = newNums; //方法二:自帶的rotate函數 /* int len = nums.size(); if (len > 1) { k %= len; std::rotate(nums.begin(), nums.end() - k, nums.end()); } */ } };
【easy】189. Rotate Array