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

【LeetCode 热题 100】双指针 系列

📁283. 移动零

        对于该题目,需要注意的是两个地方,一是保持非零元素的相对顺序,以及O(1)的空间复杂度。

        采用双指针的思路,将数组划分成3个区间,。

[0 , left]:该区间内元素全是非零元素。

[left+1 , right]:该区间内元素全是零元素。

[right , n]:还没有遍历到的元素,未知。

        left:非零区间的左端点。初始化为-1,表示没有元素。

        right: 当前遍历到的元素的下标。

void moveZeroes(vector<int>& nums) {int left = -1 , right = 0;while(right < nums.size()){if(nums[right] != 0)swap(nums[++left] , nums[right]);++right;}}

📁11. 盛最多水的容器

        核心思想:将长度固定,然后从大到小枚举, 每次使用两边较小的高度,使用完后淘汰高度较小值

int maxArea(vector<int>& height) {int ans = 0;int left = 0 , right = height.size() - 1;while(left < right){ans = max(ans , (right - left) * min(height[left] , height[right]));if(height[left] < height[right])++left;else--right;}return ans;}

📁15. 三数之和

        因为原数组是无序的,所以我们首先要对数组进行排序,方便我们使用双指针。

        我们从前往后枚举每个数,然后从该数后面通过双指针找到两个数,满足 nums[i] + nums[left] + nums[right] == 0。因为我们进行了排序,因此nums[left]、nums[right]都大于等于nums[i],如果nums[i] > 0 ,就可以不用在遍历后面的数了,因为没有结果了。

        

vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin() , nums.end());vector<vector<int>> ans;int i = 0;int n = nums.size();while(i < n){if(nums[i] > 0)break;int left = i + 1 , right = n - 1;while(left < right){if(nums[i] + nums[left] + nums[right] == 0){ans.push_back({nums[i] , nums[left++] , nums[right--]});while(left < right && nums[left] == nums[left - 1])++left;while(left < right && nums[right] == nums[right + 1])--right;}else if(nums[i] + nums[left] + nums[right] > 0)--right;else    ++left;}++i;while(i < n && nums[i] == nums[i-1])++i;}return ans;}

📁42. 接雨水

        我们采用双指针的算法,记录下来左右两侧最高的列(木桶原理),然后取出列能存储的雨水量,求和就是结果。

int trap(vector<int>& height) {int left = 0 , right = height.size() - 1;int leftMax = height[left] , rightMax = height[right];int ans = 0;while(left < right){leftMax = max(leftMax , height[left]);rightMax = max(rightMax , height[right]);if(leftMax < rightMax){//木桶原理,能接多少水取决于左边较低的列ans += (leftMax - height[left]);++left;}else{//木桶原理,能接多少水取决于右边较低的列ans += (rightMax - height[right]);--right;}}return ans;}

相关文章:

  • 基于有效样本数的类别平衡损失 (Class-Balanced Loss, CVPR 2019)
  • 量化交易 - RSRS(阻力支撑相对强度)策略研究 - 源码
  • 递归实现归并排序
  • RenderStage::runCameraSetUp
  • 对象存储概述
  • 《擦除序列》线性时间做法题解
  • 点云(Point Cloud)介绍
  • 可发1区的超级创新思路(python 、MATLAB实现):基于区域注意力双通道MABMA的时间序列预测模型
  • Megatron-Core 进行大规模语言模型(LLM)训练【专题2】
  • Vivado比特流生成、下载及板级验证操作步骤
  • 【C++算法】64.字符串_字符串相乘
  • 服务部署丨通过Docker部署AutoBangumi+qBittorrent实现自动追番
  • sql之DML(insert、delete、truncate、update、replace))
  • 前端工程化之自动化测试
  • 聊聊Doris的数据模型,如何用结构化设计解决实时分析难题
  • 【笔记】网路安全管理-实操
  • element-plus样式失效的原因总结
  • 机器学习(1)— 开发环境安装
  • 每天学一个 Linux 命令(25):more
  • n8n 中文系列教程_02. 自动化平台深度解析:核心优势与场景适配指南
  • 两名中国公民在墨尔本被海浪卷走,我领馆发文提醒
  • 中国船协发布关于美对华造船业实施限制措施的严正声明
  • 信心从何而来|当消博会展商遇上关税战
  • 恒安集团创始人许连捷逝世:白手起家缔造百亿纸品巨头,个人曾捐赠超10亿
  • 云南:近两千亩拍得土地因规划变更不得开发,政府要求转型、企业无力为继
  • 杜甫、韦应物背后的世家大族,在这个展览上一览传奇