11. Container With Most Water

题意:取两根求最大体积

思路:使用两个指针分别指向头和尾,然后考虑左右两根:

对于小的那根,如果选择了它,那么能够产生的最大体积一定是当前的情况:因为当前情况体积=这根长度 * 当前距离,以后的话长度一定是左右边界的min,即<=这根长度,距离一定越来越小

因此小的那根以后就不会被选了,因此把小的那根的指针挪动一下

直到指针相遇

class Solution {
public:
int maxArea(vector<int>& height) {
int ans = ;
int l = , r = height.size() - ;
while (l < r) {
ans = max(ans, (r - l) * min(height[l], height[r]));
if (height[l] <= height[r]) l++;
else r--;
}
return ans;
}
};

42. Trapping Rain Water

题意:给一些柱形块,求下雨时可积水的体积,如图

思路:用一个单调递减栈,只有当遇到更高的柱形的时候才会产生积水,此时的栈顶是积水的底,次栈顶是左边界,当前是右边界。

每次先栈中把比当前柱小的都计算好面积出栈,然后将当前柱入栈

class Solution {
public:
int trap(vector<int>& height) {
stack<int> s;
int n = height.size();
int ans = ;
for (int i = ; i < n; i++) {
if (s.empty() || height[i] < height[s.top()]) {
s.push(i);
}
else {
while (!s.empty() && height[s.top()] < height[i]) {
int t = s.top();
s.pop();
if (!s.empty()) {
ans += (i - s.top() - ) * (min(height[s.top()], height[i]) - height[t]);
}
}
s.push(i);
}
}
return ans;
}
};

15. 3Sum

题意:给一组数,取三个数使它们和为0,输出这三个数,要求去重

思路:On3枚举超时,排序后,先取定其中一个数nums[i],然后两个指针分别指向 i 之后的第一个和最后一个数字,由于数字是递增的,当 i, j, k 的和<0时 j++,和>0时 k--

然后当有重复时指针继续移动即可

vector中的一些用法

//声明vector
vector<int> v;
vector<vector<int>> v;
//输入
v.push_back(a);
v.push_back({a, b, c});
//排序
sort(v.begin(), v.end());
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
int n = nums.size();
int idx = ;
vector<vector<int>> ans;
for (int i = ; i < n; i++) {
if (i && nums[i] == nums[i - ]) continue;
int j = i + , k = n - ;
while (j < k) {
if (nums[i] + nums[j] + nums[k] < ) {
j++;
} else if (nums[i] + nums[j] + nums[k] > ) {
k--;
} else {
ans.push_back({nums[i], nums[j], nums[k]});
while (j < n - && nums[j] == nums[j + ]) j++;
while (k > && nums[k] == nums[k - ]) k--;
j++; k--;
}
}
}
return ans;
}
};

16. 3Sum Closest

题意:一组数,取三个数使它们的和与target的差最小

思路:还是双指针的思路,先取定一个数

排好序之后用双指针可以让On2的遍历求和降成On

为确定哪个差最小 dif 里面存差,ans存结果

class Solution {
public:
int threeSumClosest(vector<int>& nums, int target) {
int n = nums.size();
int dif = 1e9, ans = ;
sort(nums.begin(), nums.end());
for (int i = ; i < n; i++) {
int l = i + , r = n - ;
while (l < r) {
int sum = nums[i] + nums[l] + nums[r];
if (abs(target - sum) < dif) {
dif = abs(target - sum);
ans = sum;
}
if (sum < target) {
l++;
} else if (sum > target) {
r--;
} else return target;
}
}
return ans;
}
};

LeetCode || 双指针 / 单调栈的更多相关文章

  1. LeetCode 84 | 单调栈解决最大矩形问题

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题第52篇文章,我们一起来看LeetCode第84题,Largest Rectangle in Histogram( ...

  2. [每日一题2020.06.13]leetcode #739 #15 单调栈 双指针查找

    739 每日温度 ( 单调栈 ) 题目 : https://leetcode-cn.com/problems/daily-temperatures/ 题意 : 找到数组每一个元素之后第一个大于它的元素 ...

  3. leetcode Maximal Rectangle 单调栈

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052721.html 题目链接:leetcode Maximal Rectangle 单调栈 ...

  4. leetcode Largest Rectangle in Histogram 单调栈

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4052343.html 题目链接 leetcode Largest Rectangle in ...

  5. LeetCode Monotone Stack Summary 单调栈小结

    话说博主在写Max Chunks To Make Sorted II这篇帖子的解法四时,写到使用单调栈Monotone Stack的解法时,突然脑中触电一般,想起了之前曾经在此贴LeetCode Al ...

  6. LeetCode 84. Largest Rectangle in Histogram 单调栈应用

    LeetCode 84. Largest Rectangle in Histogram 单调栈应用 leetcode+ 循环数组,求右边第一个大的数字 求一个数组中右边第一个比他大的数(单调栈 Lee ...

  7. BZOJ_1307_玩具_单调栈+双指针

    BZOJ_1307_玩具_单调栈+双指针 Description 小球球是个可爱的孩子,他喜欢玩具,另外小球球有个大大的柜子,里面放满了玩具,由于柜子太高了,每天小球球都会让妈妈从柜子上拿一些玩具放在 ...

  8. [LeetCode]739. 每日温度(单调栈)

    题目 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temperatures ...

  9. [bzoj2086][Poi2010]Blocks_单调栈_双指针

    Blocks bzoj-2086 Poi-2010 题目大意:题目链接. 注释:略. 想法:首先,不难发现,如果连续的一段数的平均值不小于输入的k的话,这段数是满足题意的. 所以,我们再次简化一下:将 ...

随机推荐

  1. (2)ASP.NET Core 依赖关系注入(服务)

    1.前言 面向对象设计(OOD)里有一个重要的思想就是依赖倒置原则(DIP),并由该原则牵引出依赖注入(DI).控制反转(IOC)及其容器等老生常谈的概念,初学者很容易被这些概念搞晕(包括我在内),在 ...

  2. ios NSFileManager创建目录、文件

    NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *str1 = NSHomeDirectory(); _fi ...

  3. 如何使Label有修改功能

    如何使Label有修改功能 之前制作一个项目时需要这样一个功能: 双击Label, 随后Label变为TextBox,用户修改后回车,TextBox变回Label 之前使用WPF做了一个,代码如下: ...

  4. 洛谷P4717 【模板】快速沃尔什变换(FWT)

    传送门 这玩意儿太骚了…… 参考了yyb巨佬的 //minamoto #include<iostream> #include<cstdio> #define ll long l ...

  5. js对象 数组Array详解 (参照MDN官网:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)

    一:数组的创建方式: 1.采用直接量创建 var arr = [];//创建一个空数组 var arr2 = [1,2,3];//创建一个有三个元素的数组 2.采用构造函数创建 a.var arr1 ...

  6. Mybatis源码解析(二)

    根据上篇的代码跟踪mybatis已经ready好 SqlSessionFactory了,下面就是我们怎么去通过这个factory去获取sqlSession会话了,继续扒源码: mybatis-spri ...

  7. VC++6.0下新建工程中有17个选项,都是做什么用的?

    要理解每种工程的作用需要很多基础知识,只能简要的和你讲一下: 1.ATL COM AppWizard 用来新建一个COM组件的向导,比如WORD里用的公式编辑器就是一个COM组件. 2.Cluster ...

  8. hdu 6319 Problem A. Ascending Rating (2018 Multi-University Training Contest 3)

    #include <stdio.h> #include <iostream> #include <cstdlib> #include <cmath> # ...

  9. C - Heavy Transportation

    //改版dijkstra #include <iostream> #include <algorithm> #define Faster ios::sync_with_stdi ...

  10. SpringBoot | 启动异常 | 显示bulid success 无 error信息

    可能原因是没有添加 web 依赖,检查pom里面是否有web <dependency> <groupId>org.springframework.boot</groupI ...