初步:給定乙個陣列,將陣列中的元素向右移動 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 ...