每日一題 陣列系列 5 旋轉陣列

2021-10-22 03:22:35 字數 1967 閱讀 3641

初步:給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。

高階:你可以使用空間複雜度為 o(1

) 的原地演算法解決這個問題嗎?

示例 1

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

]示例 2

:輸入:nums =[-

1,-100,3

,99], k =

2輸出:[3,

99,-1

,-100]

解釋:

向右旋轉 1 步:[99

,-1,

-100,3

]向右旋轉 2 步:[3

,99,-

1,-100]1

<= nums.length <=2*

10^4-

2^31<= nums[i]

<=2^

31-10

<= k <=10^

5

主要思路:假設原來陣列長度為 n,在遍歷整個原陣列過程中,只需將原陣列下標為 i 的元素放至新陣列下標為 (i+k)%n 的位置,最後將新陣列拷貝至原陣列即可。

c++實現如下:

class

solution

nums.

assign

(temp.

begin()

, temp.

end())

;}};

注:assign()相當於乙個拷貝函式,函式原型:void assign(const_iterator first, const_iterator last),能輕鬆實現陣列的拷貝。

測試結果:

複雜度分析:

在本題的高階要求裡,規定了o(1)的空間複雜度。所以按照第一種方法做是不滿足要求的,這時我們就要思考用原地演算法來解決了。

主要思路:通過觀察,發現可以通過反轉陣列的方式巧妙地解決本題。為了更直觀地表述,我們以 n=7,k=3 為例進行如下展示:

操作value

原始陣列

1 2 3 4 5 6 7

翻轉所有元素

7 6 5 4 3 2 1

翻轉 [ 0, k%( n - 1) ] 區間的元素

5 6 7 4 3 2 1

翻轉 [ k%n, n - 1] 區間的元素

5 6 7 1 2 3 4

總的來說,該方法一共分為三步:

c++**如下:

class

solution

}void

rotate

(vector<

int>

& nums,

int k)

};

測試結果:

複雜度分析:

由於水平有限,部落格中難免會有一些錯誤,有紕漏之處懇請各位大佬不吝賜教!

推薦文章

LeetCode每日一題 189 旋轉陣列

tag array difficulty easy link 對於陣列元素的變動,最容易想到的就是暴力。旋轉k次,每次將陣列整體移動一次 題解class solution 複雜度分析 旋轉k次數組,那麼k n個元素會被移動到頭部,剩下的元素向後移動。在這個方法中,我們先將所有元素反轉,然後反轉前k個...

每日一題 11 旋轉陣列的最小數字

tag 二分查詢 難易程度 簡單 題目描述 把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的乙個旋轉,輸出旋轉陣列的最小元素。例如,陣列 3,4,5,1,2 為 1,2,3,4,5 的乙個旋轉,該陣列的最小值為1。示例1 輸入 3,4,5,1,2 輸出 1示...

每日一題 搜尋旋轉排序陣列

題目描述 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n ...