旋轉陣列 LeetCode 思維 模擬

2021-08-27 11:46:17 字數 1264 閱讀 1947

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

示例 1:

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

輸入:[-1,-100,3,99]和 k = 2輸出:[3,99,-1,-100]解釋:向右旋轉 1 步: [99,-1,-100,3]

向右旋轉 2 步: [3,99,-1,-100]

說明:

題解:leetcode基礎題,暴力模擬也可以過,但是我覺得這題暴力過就失去了意義,做法有很多,下面是兩種思路,經測試兩種思路的時間複雜度都差不多都是o(1),而不是暴力模擬的k*o(1)

第一種:

將陣列分為兩部分,假設陣列長度是n,第一組為[0,n-k-1],另外一組為[n-k,n-1],因為後面那組實際上是要平移到最前面,而前面那組是要平移到後面,即兩組位置進行平移交換,那麼我們可以經過三次翻轉得到,第一次將第一組原地首尾互置,第二次將第二組原地首尾互置,最後將整個陣列首尾互置,就得到了我們要的結果。

第二種:

假設陣列長度為n,那麼我們可以將陣列分為n/k組,第一重迴圈遍歷0到k-1,第二重迴圈通過數學推算出其他組相同位置的下標,比如n=6,1 2 3 4 5 6,k=2時,那麼1 3 5就算作是每一組的相同位置,進行替換位移,最後每個元素遍歷一次就可以完成換位,但是需要注意,當n/k不為整數時,需要將多出來的不成一組的位置進行特殊處理。。這部分還是很麻煩的,調了好幾次才調好,**也多了不少,最後擊敗了百分之99.97的人。。

本題需要注意的是資料賊坑,n,k都可以為0,k也可以大於n,需要特判和特殊處理。

我用的是第二種,**:

class solution 

}int j=0;

if(i+(j+1)*k=p)

}if(s%k!=0)

for(int i=0;i}

};

LeetCode 旋轉陣列

將包含n 個元素的陣列向右旋轉 k 步。例如,如果 n 7 k 3,給定陣列 1,2,3,4,5,6,7 向右旋轉後的結果為 5,6,7,1,2,3,4 注意 盡可能找到更多的解決方案,這裡最少有三種不同的方法解決這個問題。要求空間複雜度為 o 1 關聯的問題 反轉字串中的單詞 ii public ...

LeetCode 旋轉陣列

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 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...

leetcode 旋轉陣列

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 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,...