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. lightoj1145 【DP优化求方案】

    题意: 有一个k面的骰子,然后问你n个骰子朝上的面数字之和=s的方案: 思路: dp[i][j] 代表 前 i 个骰子组成 j 有多少种方案: 显然 dp[i][j] = dp[i - 1][j - ...

  2. lightoj1026【tarjan】

    题意: 据说就是找桥: 思路: 无敌RE......是cmp写挫了...现在数组开太大了 模板题: #include <bits/stdc++.h> using namespace std ...

  3. euler证明

    我们用g(x)表示x的欧拉函数值,即1~x与x互质的数的个数 欧拉函数公式为: g(x)= y*((x1-1)/x1)*((x2-1)/x2)*((x3-1)/x3)....(其中x1, x2, x3 ...

  4. JPA_day01

  5. python连接mysql时连接不到test文件夹怎么办

    最新版mysql安装后默认是没有test文件夹的,这时候需要我们自己创建一个test文件夹, 文件默认路径如下    C:\ProgramData\MySQL\MySQL Server 5.7\Dat ...

  6. 获取元素属性 和 获取元素的CSS属性

  7. python 基础(十五) socket编程

    SOCKET TCP协议: 有请求 有响应 称之为 tcp协议 是面向连接的协议 就是在收发数据之前 必须先要建立一个可靠的链接 三次握手 如:网站 UDP协议: 是一个非链接的协议 传输之前不需要键 ...

  8. python入门之集合set

    集合(无序不重复) 创建 s = {} s = set() 转换 s = set(li) 方法 s.add("chy") #添加元素 s.clear() #清除元素 a = s.d ...

  9. TAIL and HEAD

    TAIL and HEAD tail tail:将指定的文件的最后部分输出到标准设备,通常是终端,和cat以及more等显示文本的差别在于:假设该档案有更新,tail会自己主动刷新,确保你看到最新的档 ...

  10. AJPFX关于子类父类中的构造

    1.子父类中的构造函数不存在重写,因为子父类的构造函数名字不一样(重写要求子父类的方法名字一模一样,包括参数列表)2.子类创建对象时会先运行父类的构造函数再运行子类的构造函数.因为每个子类的构造函数的 ...