代码随想录算法训练营第35天|860.柠檬水找零 、406.根据身高重建队列 、452. 用最少数量的箭引爆气球
860.柠檬水找零
自己的想法:
遍历的时候,使用一个数组存储记录5、10、20的数量,同时分析是否能够找零
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
// 用于存储5、10、20各自的数量
vector<int> vec(3);
for (int i = 0; i < bills.size(); ++i) {
if (bills[i] == 5) vec[0]++;
if (bills[i] == 10) {
vec[1]++;
if (vec[0] >= 1) {
vec[0]--;
} else {
return false;
}
}
if (bills[i] == 20) {
vec[2]++;
if (vec[1] >= 1 && vec[0] >= 1) {
vec[1]--;
vec[0]--;
} else if (vec[0] >= 3) {
vec[0] -= 3;
} else {
return false;
}
}
}
return true;
}
};
可以改进的就是,20的不需要记录数量了,因为20又不用找零,直接用一个变量记录也可。
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
// 用于存储5、10各自的数量
int five = 0, ten = 0;
for (int i = 0; i < bills.size(); ++i) {
if (bills[i] == 5) five++;
if (bills[i] == 10) {
ten++;
if (five >= 1) {
five--;
} else {
return false;
}
}
if (bills[i] == 20) {
if (ten >= 1 && five >= 1) {
five--;
ten--;
} else if (five >= 3) {
five -= 3;
} else {
return false;
}
}
}
return true;
}
};
406.根据身高重建队列
直接告诉我,有插入操作,使用链表比使用数组好.vector的底层实现是数组,而list的底层是链表,插入的效率比vector高。
// 使用vector
class Solution {
public:
// 身高从大到小排序,身高相同的k小的放在前面
static bool cmp(const vector<int>& a, const vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);
vector<vector<int>> que;
for (int i = 0; i < people.size(); ++i) {
int position = people[i][1];
// 插入到下标为position的位置
que.insert(que.begin() + position, people[i]);
}
return que;
}
};
// 使用list
class Solution {
public:
// 身高从大到小排(身高相同k小的站前面)
static bool cmp(const vector<int>& a, const vector<int>& b) {
if (a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort (people.begin(), people.end(), cmp);
list<vector<int>> que;
for (int i = 0; i < people.size(); i++) {
int position = people[i][1];
// 插入到下标为position的位置
std::list<vector<int>>::iterator it = que.begin();
// 寻找在插入位置
while (position--) {
it++;
}
que.insert(it, people[i]);
}
// 类型转换
return vector<vector<int>>(que.begin(), que.end());
}
};
452. 用最少数量的箭引爆气球
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b) {
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
if (points.size() == 0) return 0;
sort(points.begin(), points.end(), cmp);
int res = 1;
int minRight = points[0][1];
for (int i = 1; i < points.size(); ++i) {
if (points[i][0] > points[i - 1][1]) {
res++;
} else {
// 更新重叠气球最小右边界
points[i][1] = min(points[i][1], points[i - 1][1]);
}
}
return res;
}
};