[每日一题2020.06.13]leetcode #739 #15 单调栈 双指针查找
739 每日温度 ( 单调栈 )
题目 : https://leetcode-cn.com/problems/daily-temperatures/
题意 : 找到数组每一个元素之后第一个大于它的元素的位置
思路 : 从后往前遍历数组, 进行压栈操作, 栈中保留元素在T中的索引, 栈始终呈下大上小的状态, 对于每个遍历到的元素如果小于栈顶则输出1, 如果大于栈顶则把栈顶元素弹出知道匹配到小于的元素
核心 : 维护一个单调递减栈
( 忘记存代码了, 嫖一份算了
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& T) {
vector<int> ans(T.size());
stack<int> s;
for (int i = 0; i < T.size(); ++i) {
while (!s.empty() && T[i] > T[s.top()]) {
int temp = s.top();
ans[temp] = i - temp;
s.pop();
}
s.push(i);
}
return ans;
}
};
15 三数之和 双指针查找
题意 : 给一个数组找出数组中所有a+b+c = 0的元素组合, 注意避免重复
题目 : https://leetcode-cn.com/problems/3sum/
思路 : 先sort, 然后查找 : a元素从头开始遍历, b和c用两个指针前后双指针查找, 复杂度O(\(N^2\))
容易出错的点 :
- 避免重复的过程中, 出现指针越界的现象的判定
- 压入数组的时间
- 当a+b+c==0后对两指针的操作时指针越界的判定
反正我交了5发, 问题都是靠特判解决的, 这种题还是要多列几种情况再动手
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<vector<int> > threeSum(vector<int>& nums) {
vector< vector<int> > ans;
vector<int> tmp(3);
sort(nums.begin(), nums.end());
for (unsigned int i = 0; i < nums.size(); ++i)
{
if(i != 0)
while(nums[i]==nums[i-1] && i < nums.size()-2)++i;
if(nums[i] > 0 || i>=nums.size()-2) break;
int a = nums[i];
int l = i+1, r = nums.size() - 1;
while(l < r) {
if(a + nums[l] + nums[r] == 0) {
tmp[0] = a, tmp[1] = nums[l], tmp[2] = nums[r];
l++;r--;
while(nums[l]==nums[l-1] && l<r)l++;
while(nums[r]==nums[r+1] && l<r)r--;
}
ans.push_back(tmp);
else{
if(nums[l] + a < -nums[r])
l++;
else
r--;
}
}
}
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
int a[6] = {3, 0, -2, -1, 1, 2};
vector<int> num(a, a+6);
vector< vector<int> > s = threeSum(num);
for(unsigned int i = 0; i < s.size(); ++i) {
for(int j = 0; j < 3; ++j) {
cout << s[i][j] << " ";
}
cout << endl;
}
return 0;
}