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

【专题刷题】双指针(四):最接近的三数之和,接雨水

📝前言说明:

  • 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

视频

  • 16. 最接近的三数之和
    • 个人解
    • 优质解:
  • 42.接雨水
    • 个人解
    • 优质解:


16. 最接近的三数之和

在这里插入图片描述

个人解

思路:和三数之和差不多,这里是最接近的话,只需要使用一个min_diff来记录差值,ans来记录答案就可以了。只是这里的双指针的移动有点区别,每次对当前组合判断完是否需要替换ans就可以直接移动了
用时:16:30
屎山代码(通过):

class Solution {
public:int threeSumClosest(vector<int>& nums, int target) {ranges::sort(nums);int ans, n = nums.size();int min_diff = INT_MAX; for(int i = 0; i < n - 2; i++){if(i && nums[i - 1] == nums[i])continue;int x = nums[i];int s = x + nums[i + 1] + nums[i + 2];if(s > target){if(s - target < min_diff){min_diff = target - s;ans = s;}break;}s = x + nums[n-2] + nums[n-1];if(s < target){if(target - s < min_diff){min_diff = target - s;ans = s;}continue;}int j = i + 1, k = n - 1;while(j < k){s = x + nums[j] + nums[k];if(s == target)return target;else if(s > target){if(s - target < min_diff){min_diff = s - target;ans = s;}k--;}else {if(target - s < min_diff){min_diff = target - s;ans = s;}j++;}}}return ans;}
};

时间复杂度:O( n 2 n^2 n2)
空间复杂度:O(1)


优质解:

无,主要借鉴别人的代码优化部分。


42.接雨水

在这里插入图片描述

个人解

思路:

  • 装水一定是由短边决定
  • 我们把每一个格子都看做是一个容器
  • 一个格子能装多少水,是由短边和自身柱子的高度决定的,即短边高 - 自身柱子高
  • 但是这个短边不是指格子旁边的短边,是指左侧最高边和右侧最高边之间较短的那一个
  • 为什么是最高边?因为最高边一定能把里面的水都围住,没有水能流出去。

具体代码实现:

  • left指向左边的柱子,right指向右边的柱子,用left_max指向左侧的最高边,right_max指向右侧的最高边。
  • 每次装水装的是短边的那边的格子的水。
  • 一个格子的装水量v = min(left_max, right-max) - 该格子柱子高度
  • 哪边装完水哪边就移动。

用时:22:40
屎山代码(通过):

class Solution {
public:int trap(vector<int>& height) {int left = 0, ans = 0, right = height.size() - 1, left_max = 0, right_max = 0;while(left < right){left_max = max(left_max, height[left]);right_max = max(right_max, height[right]);if(left_max < right_max){ans += left_max - height[left];left++; }else{ans += right_max - height[right];right--;}}return ans;}
};

时间复杂度:O(n)
空间复杂度:O(1)


优质解:

我还是把我的思路画出来吧。

理解1
接水量一定由短边决定,如图:
在这里插入图片描述

理解2
假如,左侧的边短于右侧的边,则往里面走,装水量一定由左侧的最长边决定,如图:
在这里插入图片描述


🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

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

相关文章:

  • C#中扩展方法和钩子机制使用
  • ARINC818协议的帧格式
  • 如何构建跨平台可复用的业务逻辑层(Web、App、小程序)
  • Elasticsearch倒排索引与传统索引对比
  • iOS 冷启动时间监控:启动起点有哪些选择?
  • OpenBMC:BmcWeb log输出
  • 消息中间件——RocketMQ(二)
  • git push
  • MySQL快速入门篇---库的操作
  • 2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(二级)答案 + 解析
  • 深入规划 Elasticsearch 索引:策略与实践
  • RFID图书管理系统如何重构数字化仓储管理新生态
  • 【硬件系统架构】冯·诺依曼架构
  • VOIP通信中的错误码
  • 深度学习| Deep Snake环境配置+训练+预测评估(超全面)
  • android 打包内容 安卓打包工具有哪些
  • C++学习:六个月从基础到就业——内存管理:new/delete操作符
  • 中间件--ClickHouse-10--海量数据存储如何抉择ClickHouse和ES?
  • Linux:线程概念与控制
  • PDF.js 生态中如何处理“添加注释\添加批注”以及 annotations.contents 属性
  • 观察者模式详解与C++实现
  • kafka jdbc connector适配kadb数据实时同步
  • Spring Boot 核心注解全解:@SpringBootApplication背后的三剑客
  • 力扣每日打卡 2364. 统计坏数对的数目 (中等)
  • HTTP测试智能化升级:动态变量管理实战与效能跃迁
  • Spring开发系列教程(20)——Spring MVC
  • Flutter 自定义插件基础
  • 【unity实战】Animator启用root motion根运动动画,实现完美的动画动作匹配
  • 精准检测新选择:国产OLI-P偏振串扰分析仪正式发布
  • PHP连接MYSQL数据库