739. 每日温度
1.暴力法,两层for循环。第一次最后一个测试用例没过,稍微优化了一下。虽然过了,但是时间开销较大。
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
vector<int> result;
for (int i = 0; i < temperatures.size() - 1; i++) {
if (i > 0 && temperatures[i] == temperatures[i - 1] &&
result.back() != 0) {
result.push_back(result.back() - 1);
continue;
}
int j;
for (j = i + 1; j < temperatures.size(); j++) {
if (temperatures[j] > temperatures[i]) {
result.push_back(j - i);
break;
}
}
if (j == temperatures.size())
result.push_back(0);
}
result.push_back(0);
return result;
}
};
2.单调栈法。个人感觉不难理解,关键在while循环,有点像之前的单调队列?
class Solution {
public:
vector<int> dailyTemperatures(vector<int>& temperatures) {
stack<int> st;
st.push(0);
vector<int> result(temperatures.size(), 0);
for (int i = 1; i < temperatures.size(); i++) {
while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
result[st.top()] = i - st.top();
st.pop();
}
st.push(i);
}
return result;
}
};
496.下一个更大元素 I
1.暴力法。在数组2中找到目标元素,然后往后遍历找到第一个比目标元素大的元素。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
vector<int> result;
for (int i = 0; i < nums1.size(); i++) {
int j;
for (j = 0; j < nums2.size(); j++) {
if (nums1[i] == nums2[j])
break;
}
for (; j < nums2.size(); j++) {
if (nums2[j] > nums1[i])
break;
}
if (j == nums2.size()) {
result.push_back(-1);
} else {
result.push_back(nums2[j]);
}
}
return result;
}
};
2.单调栈法。本题虽然是easy,但是单调栈法却比上一题复杂,需要多用一个map哈希表记录映射关系,反而是暴力法比较容易想到且写出代码。不过本质单调栈的思想并不难理解。
class Solution {
public:
vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
stack<int> st;
vector<int> result(nums1.size(), -1);
unordered_map<int, int> umap;
for (int i = 0; i < nums1.size(); i++) {
umap[nums1[i]] = i;
}
for (int j = 0; j < nums2.size(); j++) {
while (!st.empty() && nums2[j] > nums2[st.top()]) {
if (umap.find(nums2[st.top()]) != umap.end()) {
int index = umap[nums2[st.top()]];
result[index] = nums2[j];
}
st.pop();
}
st.push(j);
}
return result;
}
};
今日总结:单调栈,启动!