📝前言说明:
- 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录,按专题划分
- 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
- 文章中的理解仅为个人理解。如有错误,感谢纠错
🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀优快云主页 愚润泽
你可以点击下方链接,进行该专题内不同子专题的学习
| 点击链接 | 开始学习 |
|---|---|
| 双指针(1) | 双指针(2) |
| 双指针(3) | 双指针(4) |
| 滑动窗口(1) | 滑动窗口(2) |
| 滑动窗口(3) | 滑动窗口(4) |
| 二分查找(1) | 二分查找(2) |
| 前缀和(1) | 前缀和(2) |
| 前缀和(3) | 位运算(1) |
| 位运算(2) | 模拟算法 |
| 快速排序 | 归并排序 |
| 链表 | 哈希表 |
| 字符串 | 栈 |
| 队列 + 宽搜 | 优先级队列 |
| BFS 解决 FloodFill | BFS 解决最短路径 |
| 多源 BFS | BFS 解决拓扑排序 |
题单汇总链接:点击 → 题单汇总
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
假如,左侧的边短于右侧的边,则往里面走,装水量一定由左侧的最长边决定,如图:

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

671

被折叠的 条评论
为什么被折叠?



