860.檸檬水找零?
貪心的思路就是,先把最沒用的錢給找出去。本題中,20元沒法花出去,只有10和5能找零,但10只能找零20,而5可以找零10與20,所以就想辦法把10先花出去即可。之后按照收入順序來記錄錢數并選擇找零。如果某次錢的數目變為負數,則說明無法找零,輸出錯誤。
class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five = 0, ten = 0, twenty = 0;for (auto a : bills){if (a == 5) five++;if (a == 10){if (five < 0) return false;ten++;five--;}if (a == 20){if (ten > 0 && five > 0){ten--;five--;} else if (five >= 3){five -= 3;} else {return false;}}}return true;}
};
406.根據身高重建隊列?
先根據第一項排序,然后根據第二項的大小來插入數組
class Solution {
public: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];que.insert(que.begin() + position, people[i]);}return que;}
};
452.?用最少數量的箭引爆氣球
將數組按照右邊界排序,只有當前的最小右邊界比下一個左邊界大,那就只需要一箭,反之則需要兩只箭,之后再更新右邊界,繼續判斷。
class Solution {
public:static bool cmp(const vector<int>& a,const vector<int>& b){return a[1] < b[1];}int findMinArrowShots(vector<vector<int>>& points) {if (points.empty()) return 0;sort(points.begin(),points.end(),cmp);int pos = points[0][1];int ans = 1;for (auto& a: points){if (a[0] > pos){pos = a[1];ans++;}}return ans;}
};