要右移k次,且只能用o(1)的空間,最簡單的辦法是迴圈k次,每次用乙個變數temp記錄最後乙個位置的值,然後讓最後乙個下標(下標從0開始)到下標1的值都為前乙個元素的值,再讓下標0的值為temp。
這樣進行k次之後,就完成了迴圈右移k次。
不過這樣會超時,乙個較簡單的做法是,對於右移到陣列前邊的k個數,將他們看作乙個部分,然後在這k個數之前的所有數看作一部分,兩部分分別做翻轉(reverse操作),然後再把整個陣列做翻轉,得到的就是右移k次之後的陣列。 貌似庫函式rotate也是這麼實現的。
舉個例子吧,第乙個樣例[1,2,3,4,5,6,7],k = 3,總共要右移三次,最後得到的陣列是[5,6,7,1,2,3,4]。
我們把陣列右移到前面部分和後面部分的陣列劃分為兩個部分,分別做reverse: 前四個元素reverse得到:[4, 3, 2, 1], 後三個元素reverse得到:[7, 6, 5]。
這兩部分都reverse之後的陣列就是[4, 3, 2, 1, 7, 6, 5], 然後我們把整個陣列reverse一下:[5, 6, 7, 1, 2, 3, 4]。就ok了。
這裡要注意,k可能比陣列長度還大,但是每右移陣列的長度次,就等於回到了原點,所以在reverse操作之前需要把k對陣列的長度取餘。
class solution
};
LeetCode189 旋轉陣列
這個部落格就用來記錄學習過程中遇到的一些問題吧,菜雞一枚,歡迎各位大佬指正批評。先對前面部分進行反轉 0,len k 1 再對後面部分進行反轉 len k,nums.size 1 最後對整個陣列進行反轉即可實現邏輯右移k位。1.提交編譯的時候遇到了陣列越界問題 double free or corr...
leetcode189 旋轉陣列
思想 首先判斷nums是否為空以及k是否為零,若是則直接返回nums。然後定義乙個反轉函式reverse,使得陣列前後元素調換位置,直到全部調換。最後先nums 0,len nums 1 k 開始調換,然後nums en nums 1 k 1,len nums 1 開始調換,最後nums 0,len...
leetcode 189 旋轉陣列
給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。輸入 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 1.第...