406. 根据身高重建队列
method 1
先把高的排好,然后低的一个一个往前插到对应的位置上,因为相对于前面都是比他高的所以插入到【1】的位置即可
class Solution {
public:
static bool cmp(vector<int>& x, vector<int>& y) {
return x[0] == y[0] ? x[1] <= y[1] : x[0] > y[0];
}
void changeP(vector<vector<int>>& people, int from, int to) {
vector<int> tmp = people[from];
for(int i = from; i > to; i--) {
swap(people[i], people[i - 1]);
}
people[to] = tmp;
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);
for(int i = 0; i < (int)people.size(); i++) {
if(i == people[i][1]) continue;
changeP(people, i, people[i][1]);
}
return people;
}
};
method 2
可以使用vector的insert方法更简洁,但是时间更慢
class Solution {
public:
static bool cmp(vector<int>& x, vector<int>& y) {
return x[0] == y[0] ? x[1] <= y[1] : x[0] > y[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);
vector<vector<int>> res;
for(auto p : people) {
res.insert(res.begin() + p[1], p);
}
return res;
}
};
452. 用最少数量的箭引爆气球
method 1
只需要对出边进行判断即可,如果当前矩形在出边范围内就下一个,否则更新出边
class Solution {
public:
static bool cmp(vector<int>& x, vector<int>& y) {
return x[1] < y[1];
}
int findMinArrowShots(vector<vector<int>>& points) {
sort(points.begin(), points.end(), cmp);
int res = 1, edgeExit = points[0][1];
for(int i = 0; i < (int)points.size(); i++) {
if(edgeExit >= points[i][0] && edgeExit <= points[i][1]) continue;
else edgeExit = points[i][1], res++;
}
return res;
}
};
402. 移掉 K 位数字
method 1
查找最左侧的逆序对
class Solution {
public:
string removeKdigits(string num, int k) {
if(num.length() == k) return "0";
int cnt = 0, i;
bool flag;
while (cnt < k) {
flag = false;
for(i = 0; i < num.length() - 1; i++) {
if(num[i] > num[i + 1]) {
flag = true;
num.erase(num.begin() + i);
cnt ++;
break;
}
}
if(!flag) {
num.insert(num.begin(), '0');
for(int i = 0; i < k - cnt; i++) num.erase(num.end() - 1);
break;
}
}
for(int i = 0; i < num.length() - 1; i++) {
if(num[i] == '0') num.erase(num.begin()), i--;
else break;
}
return num;
}
};
method 2
用单调栈的方法,这里雪菜使用了string来替代了单调栈,更简洁
class Solution {
public:
string removeKdigits(string num, int k) {
string res;
for(char c : num) {
while(res.length() && res.back() > c && k) {
res.pop_back();
k --;
}
res += c;
}
while(k --) res.pop_back();
res.insert(res.begin(), '0');
for(int i = 0; i < res.length() - 1; i++) {
if(res[i] == '0') res.erase(res.begin()), i--;
else break;
}
return res;
}
};
134. 加油站
method 1
寻找一个欠石油最多的地方即可,最后判断一下是不是不能返回
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int n = gas.size(), res, m = 1e5, tmp = 0;
for(int i = 0; i < n; i++) {
tmp += gas[i] - cost[i];
if(tmp <= m) {
res = i;
m = tmp;
}
}
return tmp >= 0 ? (res + 1) % n : -1;
}
};