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

leetcode 769, 768 最多能完成排序的块 单调栈建模


768和769本质相同,都是单调栈
为什么能用单调栈?
核心思路:块的最大值小于等于右边所有元素
隐藏边界:块的边界会通过较小元素进行破坏,从而继续保持单调性。

classSolution{public:intmaxChunksToSorted(vector<int>&arr){vector<int>st{-1};for(autonum:arr){intmx=num;while(num<st.back()){mx=max(mx,st.back());st.pop_back();}st.push_back(mx);}// for(auto t: st)printf("%d ", t);returnst.size()-1;}};

首先是769,这个题是很简单的,只要看最大元素和索引关系即可。

classSolution:defmaxChunksToSorted(self,arr:List[int])->int:result,bad=0,-1foriinrange(len(arr)):bad=max(bad,arr[i])ifbad<=i:result+=1bad=-1returnresult

768则是这个题的终极复杂形式,数组里数据不再是简单的0-n,变成任意数据,还可以重复。
解法一:O(NlogN)
思路:转化为第一题的思路,看到这个数一定要知道这个数在数组的排序位置,这样O(N)就能解决(除去排序的NlogN)。
可以先排序,找到各个元素对应的位置,再扫一遍即可。对于重复元素,存一个优先队列,需要的时候排出来最小的。

pos=sorted(range(len(arr)),key=lambdax:arr[x])

一个很奇怪的地方,就是python本身的bug,上述代码是无法返回正确的排序后索引的,可能是python版本的问题。所以这里要自己对数组排序后再自己遍历一遍手动得到索引,代码如下:

fromqueueimportPriorityQueueclassSolution:defmaxChunksToSorted(self,arr:List[int])->int:# get sorted idxnum2q={}sorted_arr=sorted(arr)foridx,numinenumerate(sorted_arr):ifnumnotinnum2q:num2q[num]=PriorityQueue()num2q[num].put(idx)# base algorithmresult,bad=0,-1foridx,numinenumerate(arr):real_pos=num2q[num].get()bad=max(bad,real_pos)ifbad<=idx:result+=1bad=-1returnresult

解法二:O(N)
这个解法有点dp的意思。如果一个块没法判断它是否是一个可分割块,就看他后面的元素。如果后面的元素有比他小的,那就不是,如果没有,那就是。

classSolution:defmaxChunksToSorted(self,arr:[int])->int:stack=[]fornuminarr:ifstackandnum<stack[-1]:tmp=stack.pop()whilestackandnum<stack[-1]:stack.pop()stack.append(tmp)else:stack.append(num)returnlen(stack)

这里有两个小技巧,一个是用if list可以判断list是否为空(很重要!!!)第二个是list.pop()可以直接返回列表尾部元素。
这里算法用到了单调栈的思想,看似栈内大的元素被排出去了,实际只是保留了每个块最大值,消除了无法独立成块的最大值。

http://www.jsqmd.com/news/468448/

相关文章:

  • MMDrawerController状态恢复终极指南:确保iOS侧边栏数据永不丢失
  • 扒下满级“赛博打工人”的底裤:从 OpenClaw 爆火,看透 Agent、MCP 与 RAG 的底层逻辑
  • 高速下载b站视频的解决方案
  • AbMole丨Honokiol(和厚朴酚):一种具有多靶点调节活性的天然产物及其科研应用
  • Maven管理Oracle JDBC驱动
  • Mitutoyo三丰 无线蓝牙数据发送器 协议解析
  • LLM-Adapters核心功能解析:7种适配器如何让大模型微调效率提升90%
  • Java SPI概念、实现原理、优缺点、应用场景、使用步骤、实战SPI案例
  • IoTSharp深度解析:基于.NET生态的物联网平台架构与实践
  • Flutter 三方库 essential_lints 的鸿蒙化适配指南 - 定义硬核代码准则,构建高可靠的鸿蒙应用底座
  • 【GitHub】PR的学习笔记
  • OmniParse性能优化终极指南:在T4 GPU上高效运行所有模型的10个技巧
  • HC小区物业管理系统——学习01_项目架构
  • 【Java】--方法的使用
  • 唯品花开通与关闭:额度提现流程、条件、注意事项 - 容易提小溪
  • MySQL5.7安装详细过程--window系统
  • 成为AndroidProject核心贡献者:7步开启你的开源之旅
  • 变得生疏起来能有多快
  • 基于SpringBoot+Vue的物资管理系统毕设项目(完整源码+论文+部署)
  • ComfyUI节点安装笔记
  • 如何快速实现CSS异步加载:loadCSS完整指南
  • 数据结构-顺序表【简单易懂】
  • 蓝桥杯 回文字符串
  • 基于 libhv+Brigand 实现 HTTP 接口批量自动化注册
  • 1. 冒泡排序程序
  • Java(面向对象篇)
  • 唯品花购物额度提现与个人征信:合规使用、维护信用 - 容易提小溪
  • Elasticsearch 8.x 在 java 中的使用情况
  • 量化策略兼容性设计
  • 从安装到部署:SmartFormat在.NET项目中的完整集成指南