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

【算法——双指针】

922. 按奇偶排序数组 II

算法讲解050【必备】双指针技巧与相关题目_哔哩哔哩_bilibili

main:vector<int>nums = { 3,1,2,4 };int i = 0, j = 1;int n = nums.size() - 1;while (j < nums.size() && i < nums.size())   //如果奇偶任一方排好了,另一方自然排好了{//判断最后一个元素奇偶if (nums[n] % 2 != 0) {swap(nums[j], nums[n]);    j += 2;  //来到下一个奇数位置}else {swap(nums[i], nums[n]);i += 2;  //来到下一个偶数位置}}

287. 寻找重复数

快慢指针

算法讲解050【必备】双指针技巧与相关题目_哔哩哔哩_bilibili

main:vector<int>nums = {}; int slow = nums[0];int fast = nums[nums[0]];while (slow != fast)     //一开始快指针一次2步,慢指针一次1步{fast = nums[nums[fast]];slow = nums[slow];}fast = 0;    //二者第一次相遇后,快指针重置为初始位置while (slow != fast)     //快慢都一次一步{fast = nums[fast];slow = nums[slow];}//最后返回fast和slow都可以

42. 接雨水

算法讲解050【必备】双指针技巧与相关题目_哔哩哔哩_bilibili

思想:每个格子上方的水量进行累加,首先求这个格子左边的最大格子和右边的最大值。

如果左边比右边小,那么左边就是一个兜底,我当前格子装水量就是左减当前格子数。

右比左小同理,右边就是兜底。

总结:

	min(left_max, max_right)-nums[i]
特例:当前格子数比左右都大,就直接为0,这时候没有人兜底了
最终式子:max(min(left_max, max_right)-nums[i],0)

两侧最大值怎么求? 

mainvector<int>nums = { 0,1,0,2,1,0,1,3,2,1,2,1 };int n = nums.size();vector<int>lmax(n);lmax[0] = nums[0];for (int i = 1; i < n; i++)        //左侧最大值不断继承lmax[i] = max(nums[i], lmax[i - 1]);vector<int>rmax(n);rmax[n - 1] = nums[n - 1];for (int i = n - 2; i >= 0 ; i--)   //右侧最大值不断继承rmax[i] = max(nums[i], rmax[i + 1]);int sum = 0;for (int i = 1; i < n - 1; i++)     //计算sum += max(min(lmax[i - 1], rmax[i + 1]) - nums[i], 0);cout << sum;

881. 救生艇

算法讲解050【必备】双指针技巧与相关题目_哔哩哔哩_bilibili

main:vector<int>people = { 3,5,3,4 };int limit = 3;int n = people.size();sort(people.begin(), people.end());      //进行一个排序int l = 0, r = n - 1;                    //左右指针int ans = 0;                     //计数while (l <= r){//这个边界处理至关重要,防止l和r指向同一个地方重复计数int sum = l==r ? people[l]:people[l] + people[r];  //最大和最小的都已经装不下来,所以直接最大的单独一个船if ( sum > limit)     {ans++;      //装当前遍历的最大的r--;        }else if( sum <= limit)  {ans++;     //两人一船l++;       r--;}}return ans;

变种:两个人一船时,必须体重之和为偶数。就把数组中奇偶分开,单独求最优,然后相加。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 每日一题——第九十七题
  • 【掘金量化使用技巧】用日线合成长周期k线
  • JavaScript发送邮件:实现前端触发的教程?
  • react的组件的概念和使用
  • C++——求3*3矩阵对角元素之和。
  • go语言 swagger 查询 json 字段注释
  • 教你用 python 在国内实现 openAi 的调用
  • 以小人之心度君子之腹
  • Go语言现代web开发14 协程和管道
  • QT中各数据基础类型互转方式有哪些?
  • Docker:简化应用部署与管理的神奇容器
  • 【Kubernetes】常见面试题汇总(二十三)
  • AI音乐创作带给音乐原创人的挑战和机遇
  • 深入浅出Docker
  • unity 高性能对象池解决方案
  • 《剑指offer》分解让复杂问题更简单
  • 【知识碎片】第三方登录弹窗效果
  • 10个最佳ES6特性 ES7与ES8的特性
  • Bootstrap JS插件Alert源码分析
  • centos安装java运行环境jdk+tomcat
  • learning koa2.x
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • Python进阶细节
  • Shell编程
  • Spring Boot快速入门(一):Hello Spring Boot
  • 给第三方使用接口的 URL 签名实现
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于Android乐音识别(2)
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 区块链共识机制优缺点对比都是什么
  • 设计模式 开闭原则
  • 适配iPhoneX、iPhoneXs、iPhoneXs Max、iPhoneXr 屏幕尺寸及安全区域
  • 我的业余项目总结
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 摩拜创始人胡玮炜也彻底离开了,共享单车行业还有未来吗? ...
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (2)leetcode 234.回文链表 141.环形链表
  • (6)添加vue-cookie
  • (poj1.2.1)1970(筛选法模拟)
  • (Redis使用系列) Springboot 实现Redis 同数据源动态切换db 八
  • (动态规划)5. 最长回文子串 java解决
  • (九)c52学习之旅-定时器
  • (六)激光线扫描-三维重建
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (一)Thymeleaf用法——Thymeleaf简介
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (自用)仿写程序
  • .NET C# 配置 Options
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .Net MVC4 上传大文件,并保存表单
  • .NET 直连SAP HANA数据库