六月集训(第04天)—贪心

贪心

1. 1221. 分割平衡字符串

    思路:
        贪心的选择'L''R'每次出现数量相等的L或R,答案+1,并再次统计下一组。

class Solution {
public:
    int balancedStringSplit(string s) {
        int s_len = s.length();
        int cnt = 0, i;
        int ans = 0;
        for (i = 0; i < s_len; ++i) {
            cnt += (s[i] == 'L' ? 1 : -1);
            if (cnt == 0) ans++;
        }
        return ans;
    }
};

2. 1217. 玩筹码

    思路:
        通过一次移动2步,可以将所有筹码放到0位置(偶数位置的筹码)和1位置(奇数位置的筹码),此时答案就是0位置和1位置中筹码较少的一方所拥有的筹码数。

class Solution {
public:
    int minCostToMoveChips(vector<int>& position) {
        int position_size = position.size(), i;
        int cnt_odd = 0, cnt_even = 0;
        int ans = 0;
        for (i = 0; i < position_size; ++i) {
            if (position[i] & 1) ++cnt_odd;
            else ++cnt_even;
        }
        ans = cnt_even < cnt_odd ? cnt_even : cnt_odd;
        return ans;
    }
};

3. 1029. 两地调度

    思路:
        先将所有人派到A地,再选择n个人派往B地。每个派往B地的人,需要多花费B-A的钱,将数组按照B-A升序排列,选0~n-1去B地,花费最少。

class Solution {
public:
    int twoCitySchedCost(vector<vector<int>>& costs) {
        int costs_size = costs.size(), i;
        int ans = 0;
        for (i = 0; i < costs_size; ++i) ans += costs[i][0];
        sort(costs.begin(), costs.end(), [&](const vector<int> &a, const vector<int> &b) {
            return (a[1] - a[0]) < (b[1] - b[0]);
        });
        int n = costs_size >> 1;
        for (i = 0; i < n; ++i) ans += costs[i][1] - costs[i][0];
        return ans;
    }
};

4. 面试题 10.11. 峰与谷

    思路:
        对数组排序,寻找规律发现一种实现峰谷交替出现的方法。
        (1) 当数组元素有偶数个时,直接间隔一个首位元素交换,即可实现[峰,谷,峰, ..., 谷]交替出现的情况
        (2) 当数组元素为偶数个时,将中间元素与最后一个元素交换位置,最后一个元素作为峰值,前nums_size-1个元素作为偶数个元素的序列与情况(1)做法相同。(之所以没有用最后两个元素交换位置,是因为可能会有元素个数只有1个,nums[nums.size() - 2] ==> nums[-1],数组越界的情况。)

class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        int nums_size = nums.size(), i;
        sort(nums.begin(), nums.end());
        int n = nums_size >> 1;
        if (nums_size & 1) {
            swap(nums[n], nums[nums_size - 1]);
            for (i = 0; i < n; i += 2) swap(nums[i], nums[nums_size - 1 - i - 1]);
        } else {    // even
            for (i = 0; i < n; i += 2) swap(nums[i], nums[nums_size - i - 1]);
        }
    }
};
posted @ 2022-06-04 19:43  番茄元  阅读(26)  评论(0)    收藏  举报