1.逆置法思路
目標:將這個彩色數組向右旋轉3步
🔴1 → 🟠2 → 🟡3 → 🟢4 → 🔵5 → 🟣6 → ?7
我們希望得到
🔵5 → 🟣6 → ?7 → 🔴1 → 🟠2 → 🟡3 → 🟢4
接下來我們用可視化的方式來描述逆置法的過程。
步驟1:整體大翻轉
想象把整個數組完全倒過來排列:
【原始數組】
🔴1 → 🟠2 → 🟡3 → 🟢4 → 🔵5 → 🟣6 → ?7【把每個數和它對應的位置互換】
?7 ← 🟣6 ← 🔵5 ← 🟢4 ← 🟡3 ← 🟠2 ← 🔴1
步驟2:前三個數字再翻轉
現在,只翻轉前三個數字(K=3):
【當前數組】
?7 → 🟣6 → 🔵5 → 🟢4 → 🟡3 → 🟠2 → 🔴1【把前3個數互換位置】
🔵5 → 🟣6 → ?7 → 🟢4 → 🟡3 → 🟠2 → 🔴1
?第二步完成:前3個數字排序正確了!
步驟3:剩余的四個數字也翻轉
最后,翻轉剩下的4個數字:
【當前數組】
🔵5 → 🟣6 → ?7 → 🟢4 → 🟡3 → 🟠2 → 🔴1【把后4個數互換位置】
🔵5 → 🟣6 → ?7 → 🔴1 → 🟠2 → 🟡3 → 🟢4
第三步完成:所有數字都排序正確了!
最終結果:
🔵5 → 🟣6 → ?7 → 🔴1 → 🟠2 → 🟡3 → 🟢4
2.交換過程
讓我們來看看第一步的交換是如何發生的:
原始: 🔴1 🟠2 🟡3 🟢4 🔵5 🟣6 ?7
位置: 0 1 2 3 4 5 6第一個交換: 🔴1 ? ?7[?7 🟠2 🟡3 🟢4 🔵5 🟣6 🔴1]第二個交換: 🟠2 ? 🟣6[?7 🟣6 🟡3 🟢4 🔵5 🟠2 🔴1]第三個交換: 🟡3 ? 🔵5[?7 🟣6 🔵5 🟢4 🟡3 🟠2 🔴1]最后一個交換: 🟢4 ? 🟢4 (中間元素與自己交換,不變)結果: [?7 🟣6 🔵5 🟢4 🟡3 🟠2 🔴1]
3.為什么這個方法有效?
把數組想象成兩部分:?
部分A: 🔴1 🟠2 🟡3 🟢4
部分B: 🔵5 🟣6 ?7
我們的目標是交換這兩部分:
部分B + 部分A: 🔵5 🟣6 ?7 🔴1 🟠2 🟡3 🟢4
三步法魔術?
1. 整體翻轉:(A+B)反轉 = B反轉+A反轉
🔴1🟠2🟡3🟢4🔵5🟣6?7 → ?7🟣6🔵5🟢4🟡3🟠2🔴1
?2.前K個翻轉:B反轉再反轉 = B正常
?7🟣6🔵5🟢4🟡3🟠2🔴1 → 🔵5🟣6?7🟢4🟡3🟠2🔴1
?3.后(N-K)個翻轉:A反轉再反轉 = A正常
🔵5🟣6?7🟢4🟡3🟠2🔴1 → 🔵5🟣6?7🔴1🟠2🟡3🟢4
最終得到:B + A 完成!
記憶口訣
📌 全部翻轉 → 📌 前K個翻轉 → 📌 剩余(后N-K個)翻轉 = 🎉 旋轉成功!
這樣,我們就可以得到逆置需要使用的函數了:
翻轉工具函數
// 🛠? 翻轉工具函數
void reverse(int* nums, int start, int end) {while (start < end) {// 🔄 交換兩個位置的積木int temp = nums[start];nums[start] = nums[end];nums[end] = temp;// 👉👈 兩邊向中間移動start++;end--;}
}