ในบทความนี้ เราจะเข้าใจอัลกอริทึม Reversal เพื่อหมุนอาร์เรย์ที่กำหนดไปทางขวา k ตำแหน่ง เช่น:
Input : arr[] = { 4, 6, 2, 6, 43, 7, 3, 7 }, k = 4
Output : { 43, 7, 3, 7, 4, 6, 2, 6 }
Explanation : หมุนแต่ละสมาชิก 4 ตำแหน่งทางขวา ได้ { 43, 7, 3, 7, 4, 6, 2, 6 }
Input : arr[] = { 8, 5, 8, 2, 1, 4, 9, 3 }, k = 3
Output : { 4, 9, 3, 8, 5, 8, 2, 1 }
แนวทางแก้ปัญหา
คุณสามารถแก้ได้ง่ายโดยการเลื่อนแต่ละสมาชิกไปทางขวา และทำซ้ำ k ครั้ง แต่จะใช้เวลามาก (Time Complexity O(k × N))
Reversal Algorithm: การกลับอาร์เรย์ (Reverse) และการหมุนอาร์เรย์สามารถทำได้โดยการกลับช่วงของสมาชิก ตามอัลกอริทึมนี้:
- ขั้นแรก กลับอาร์เรย์ทั้งหมด
- ปรับ k ด้วย modulus ของ k กับ N (ขนาดอาร์เรย์) เพราะ k อาจมากกว่า N
- กลับ k สมาชิกแรกของอาร์เรย์เพื่อให้เรียงลำดับถูกต้อง
- จากนั้นกลับช่วงสมาชิกที่เหลือ คือ จาก k ถึง N-1
ตัวอย่างโค้ด
using namespace std;
#include <bits/stdc++.h>
void reverse(int nums[], int start, int end) {
int temp = 0;
// กลับอาร์เรย์ด้วยการสลับ start กับ end
while (start <= end) {
temp = nums[end];
nums[end] = nums[start];
nums[start] = temp;
start++;
end--;
}
}
int main() {
int arr[] = {4, 6, 2, 6, 43, 7, 3, 6, 2, 4, 5};
int N = sizeof(arr) / sizeof(arr[0]);
int k = 4;
// กลับอาร์เรย์ทั้งหมด
reverse(arr, 0, N - 1);
k = k % N;
// กลับช่วง 0 ถึง k-1
reverse(arr, 0, k - 1);
// กลับช่วง k ถึงตัวสุดท้าย
reverse(arr, k, N - 1);
cout << "Array after rotating by k-elements : ";
for (int i = 0; i < N; i++)
cout << arr[i] << " ";
return 0;
}
ผลลัพธ์
Array after rotating by k-elements : 6 2 4 5 4 6 2 6 43 7 3
สรุป
ในบทความนี้ เราอภิบายปัญหาการหมุนอาร์เรย์ไปทางขวา k ตำแหน่งด้วยอัลกอริทึม Reversal อธิบายว่าอัลกอริทึม Reversal คืออะไรและ 어떻게นำไปใช้ เรายังมีโค้ด C++ สำหรับแก้ปัญหานี้ สามารถเขียนในภาษาอื่นได้เช่น C, Java, Python หวังว่าจะเป็นประโยชน์