代码随想录Day35

80 阅读1分钟

860.柠檬水找零

力扣题目链接

class Solution {
public:
    // 五块、十块、二十块分开考虑成三种情况,五块、十块是固定策略,二十块策略可用贪心
    // 局部最优:遇到账单20,优先消耗美元10,完成本次找零。全局最优:完成全部账单的找零。
    bool lemonadeChange(vector<int>& bills) {
        int five = 0;
        int ten = 0;
        // 记录twenty在本题中没有意义
        // int twenty = 0;
        for (auto bill : bills) {
            if (bill == 5) {
                ++five;
            }
            if (bill == 10) {
                if (five > 0) {
                    --five;
                    ++ten;
                } else {
                    return false;
                }
            }
            if (bill == 20) {
                if (ten > 0 && five > 0) {
                    --ten;
                    --five;
                    // ++twenty;
                } else if (five >= 3) {
                    five -= 3;
                    // ++twenty;
                } 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];
    }
    // 时间复杂度:O(nlog n + n^2)
    // 空间复杂度:O(n)
    // 使用vector,插入时内部扩容
    vector<vector<int>> reconstructQueue1(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;
    }
    // 使用链表
    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];
            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:
    // 时间复杂度:O(nlog n),因为有一个快排
    // 空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间
    static bool cmp(vector<int>& a, 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);
        // point的规模不为零,至少需要一只箭矢
        int result = 1;
        for (int i = 1; i < points.size(); ++i) {
            if (points[i][0] > points[i - 1][1]) {
                result++;
            } else {
                // 更新重叠气球最小右边界
                points[i][1] = min(points[i][1], points[i - 1][1]);
            }
        }
        return result;
    }
};