把一個含有N個元素的陣列迴圈右移K位, 要求時間複雜度為O(N)
阿新 • • 發佈:2019-01-10
分析與解法
這個解法其實在《啊哈!演算法》有講到。假設原陣列序列為abcd1234,要求變換成的陣列序列為1234abcd,即迴圈右移了4位,比較之後,不難看出,其中有兩段的順序是不變的:1234和abcd,可把兩段看成兩個整體。右移K位的過程就是把陣列的兩部分交換一下。變換過程通過以下步驟完成:
1.逆序排列 abcd: abcd1234 -> dcba1234;
2.逆序排列 1234: dcba1234-> dcba4321;
3.全部逆序 dcba4321->1234abcd。
using System; namespace ConsoleApp2 { class Program { static void Main(string[] args) { int[] array ={ 1, 2, 3, 4, 5, 6, 7, 8, 9}; RightShift(array, 5); foreach (int i in array) { Console.WriteLine(i); } Console.ReadKey(); } static void Reserve(int[] array, int startIndex, int endIndex) { for (int i = 0; i < (endIndex - startIndex + 1) / 2; ++i) { int mark = array[startIndex + i]; array[startIndex + i] = array[endIndex - i]; array[endIndex - i] = mark; } } static void RightShift(int[] array, int shiftNum) { shiftNum %= array.Length; if (shiftNum <= 0) { return; } Reserve(array, 0, shiftNum - 1); Reserve(array, shiftNum, array.Length - 1); Reserve(array, 0, array.Length - 1); } } }