当前位置: 首页 > java >正文

用可视化学习逆置法

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--;}
}


 

http://www.xdnf.cn/news/3707.html

相关文章:

  • 【Linux】Linux应用开发小经验
  • 信息安全导论 第七章 网络边界防御技术
  • 前端面经-VUE3篇(二)--vue3组件知识(二)依赖注入、异步组件、生命周期、组合式函数、插件
  • piccolo-large-zh-v2 和 bge-m3哪个效果好?
  • 【Mytais系列】SqlSession
  • 经典算法 求解硬币组成问题
  • 【Mytais系列】Select语句执行流程
  • 学习笔记:Qlib 量化投资平台框架 — FOR DEVELOPERS
  • 使用线性表实现通讯录管理
  • MySQL表的约束
  • Yocto介绍
  • 【C语言练习】018. 定义和初始化结构体
  • 【c++】模板详解
  • [android]MT6835 Android 移植brctl指令
  • PowerShell从5.1升级到7.X
  • 深挖Java之:运算符与输入器
  • #Paper Reading# DeepSeek-R1
  • DeepSeek与MySQL:开启数据智能新时代
  • Java SE(7)——类和对象(二)
  • 【Java Stream流-59】Java Stream流式编程:高效、优雅的数据处理之道
  • [案例二] 菜单条制作(Menuscript)与工具条制作(Toolbar)
  • Python基础语法
  • 【Arthas】火焰图优化应用CPU(问题原因:获取调用栈)
  • C语言字符函数和字符串函数详解:从基础到实战
  • C语言奇幻指南:宏、头文件与变量的秘密世界
  • 二、机器学习中Python变量基础
  • 防范反序列化攻击:如何安全处理敏感数据序列化
  • 【C/C++】MQTT
  • Git从入门到精通-第三章-获取Git仓库
  • 【Agent搭建】利用coze平台搭建一个AI销售?