20. 有效的括号
class Solution {
private:
stack<char> st;
public:
bool isValid(string s) {
for (int i = 0; i < s.size(); i++) {
switch(s[i]) {
case '{':
case '[':
case '(': st.push(s[i]);
break;
case ')': {
if (!st.empty() && st.top() == '(') st.pop();
else return false;
}
break;
case ']': {
if (!st.empty() && st.top() == '[') st.pop();
else return false;
}
break;
case '}': {
if (!st.empty() && st.top() == '{') st.pop();
else return false;
}
break;
}
}
if(st.empty()) return true;
return false;
}
};
1047. 删除字符串中的所有相邻重复项
class Solution {
public:
string removeDuplicates(string s) {
string res;
for(auto c : s){
if(res.empty() || res.back() != c) {
res.push_back(c);
}
else {
res.pop_back();
}
}
return res;
}
};
150. 逆波兰表达式求值
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> stk;
int n = tokens.size();
for (int i = 0; i < n; i++) {
string& token = tokens[i];
if (isNumber(token)) {
stk.push(atoi(token.c_str()));
} else {
int num2 = stk.top();
stk.pop();
int num1 = stk.top();
stk.pop();
switch (token[0]) {
case '+':
stk.push(num1 + num2);
break;
case '-':
stk.push(num1 - num2);
break;
case '*':
stk.push(num1 * num2);
break;
case '/':
stk.push(num1 / num2);
break;
}
}
}
return stk.top();
}
bool isNumber(string& token) {
return !(token == "+" || token == "-" || token == "*" || token == "/");
}
};
239. 滑动窗口最大值
- 采用单调队列
- 时间复杂度 O(n)
- 空间复杂度 O(k)
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> de;
for(int i = 0; i < k; ++i) {
while(!de.empty() && nums[i] > nums[de.back()]) {
de.pop_back();
}
de.push_back(i);
}
vector<int> res = {nums[de.front()]};
for(int i = k; i < nums.size(); ++i) {
while(!de.empty() && de.front() <= i-k) {
de.pop_front();
}
while((!de.empty() && nums[i] > nums[de.back()])) {
de.pop_back();
}
de.push_back(i);
res.push_back(nums[de.front()]);
}
return res;
}
};
347. 前 K 个高频元素
// 时间复杂度:O(nlogk)
// 空间复杂度:O(n)
class Solution {
public:
// 小顶堆
struct mycomparison {
public:
bool operator()(const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second > rhs.second;
}
};
vector<int> topKFrequent(vector<int>& nums, int k) {
// 要统计元素出现频率
unordered_map<int, int> map; // map<nums[i],对应出现的次数>
for (int i = 0; i < nums.size(); i++) {
map[nums[i]]++;
}
// 对频率排序
// 定义一个小顶堆,大小为k
priority_queue<pair<int, int>, vector<pair<int, int>>, mycomparison> pri_que;
// 用固定大小为k的小顶堆,扫面所有频率的数值
for (unordered_map<int, int>::iterator it = map.begin(); it != map.end(); it++) {
pri_que.push(*it);
if (pri_que.size() > k) { // 如果堆的大小大于了K,则队列弹出,保证堆的大小一直为k
pri_que.pop();
}
}
// 找出前K个高频元素,因为小顶堆先弹出的是最小的,所以倒序来输出到数组
vector<int> result(k);
for (int i = k - 1; i >= 0; i--) {
result[i] = pri_que.top().first;
pri_que.pop();
}
return result;
}
};