原題請見:Leetcode189-旋轉數組
1、題目描述
2、題目分析
首先容易想到的最簡單的方案,是算出來移動K步之后,新數組的每一個坐標與原坐標的映射關系,然后根據映射關系放到一個全新的數組,再把新數組的值賦給原數組。
但題目描述的進階方案,我們應該考慮使用 O(1)
復雜度實現。
這里不啰嗦,直接說結論:
任何有關數組的旋轉、對稱、平移的題目,優先去把題目轉換成幾次基本的對稱。
大多數情況下都能通過有限次的對稱解決。
例如本題:
假設輸入條件是:[1,2,3,4,5,6,7] k = 3
第一步:先整體左右對稱:[7,6,5,4,3,2,1]
第二步:根據 k = 3,做一個分割線: [7,6,5 | 4,3,2,1]
第三步:分割線左邊的內容做對稱,分割線右邊的內容做對稱 [5,6,7 | 1,2,3,4]
3、題解
class Solution {public void rotate(int[] nums, int k) {// 考慮使用原地對稱的算法解決這個問題// 例如:[1,2,3,4,5,6,7] k = 3// 第一步:先整體左右對稱:[7,6,5,4,3,2,1]// 第二步:根據 k = 3,做一個分割線: [7,6,5 | 4,3,2,1]// 第三步:分割線左邊的內容做對稱,分割線右邊的內容做對稱 [5,6,7 | 1,2,3,4]int minK = k % nums.length;symmetrized(nums, 0, nums.length - 1);symmetrized(nums, 0 , minK - 1);symmetrized(nums, minK, nums.length - 1);}private void symmetrized(int[] nums, int start, int end) {int mid = (start + end + 1) / 2;for (int i = 0; i + start< mid; i++) {int temp = nums[start + i];nums[start + i] = nums[end - i];nums[end - i] = temp;}}
}