1. 程式人生 > >把一個含有N個元素的陣列迴圈右移K位, 要求時間複雜度為O(N)

把一個含有N個元素的陣列迴圈右移K位, 要求時間複雜度為O(N)

分析與解法

這個解法其實在《啊哈!演算法》有講到。

假設原陣列序列為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);
        }
    }
}