《六月集训》(第四天)——贪心

前言

        欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
        今天是六月集训第四天:贪心
在这里插入图片描述

一、练习题目

        1221. 分割平衡字符串
        1217. 玩筹码
        1029. 两地调度
        面试题 10.11. 峰与谷

二、算法思路

  • 1、1221. 分割平衡字符串:五月集训做过,不难。✈️
  • 2、1217. 玩筹码:理解题目意思也不难。✈️
  • 3、1029. 两地调度:贪心思想,先按照A地代价从小到大排序,前一半全去A,那么剩下的全去B就行。✈️
  • 4、面试题 10.11. 峰与谷:贪心的思想,排好序以后,维护两个指针,从头拿一个,再尾拿一个一定能满足题意。✈️

三、源码剖析

// 1221. 分割平衡字符串
class Solution {
public:
    int balancedStringSplit(string s) {
        int cnt = 0, ans = 0;
        for(int i = 0; i < s.size(); ++i) {
            cnt += (s[i] == 'L') ? +1 : -1;
            if(cnt == 0) {
                ans++;
            }
        }
        return ans;
    }
};
  • 1、用一个计数器,碰到L加一,碰到R减一,如果计数器为零说明平衡贪心的切一刀。
// 1217. 玩筹码
class Solution {
public:
    int minCostToMoveChips(vector<int>& position) {
        int cost, mincost = INT_MAX;
        for(int i = 0; i < position.size(); ++i) {
            cost = 0;
            for(int j = 0; j < position.size(); ++j) {
                if((position[j] - position[i]) & 1) {
                    cost++;
                }
            }
            mincost = min(mincost, cost);
        }
        return mincost;
    }
};
  • 1、数据量不大直接遍历每一个位置,找到那个最小的cost。
// 1029. 两地调度
class Solution {
public:
    int twoCitySchedCost(vector<vector<int>>& costs) {
        int ans = 0;
        sort(costs.begin(), costs.end(), [&](const vector<int>& a, const vector<int>& b){
            return a[0] - a[1] < b[0] - b[1];
        });
        int n = costs.size() / 2;

        for(int i = 0; i < n; ++i) {
            ans += costs[i][0];
        }

        for(int i = n; i < costs.size(); ++i) {
            ans += costs[i][1];
        }
        return ans;
    }
};
  • 1、看前面的思路很好理解。
// 面试题 10.11. 峰与谷
class Solution {
public:
    void wiggleSort(vector<int>& nums) {
        vector<int> tmp;
        sort(nums.begin(), nums.end());
        int l = 0, r = nums.size() - 1;
        while(l < r) {
            tmp.emplace_back(nums[r--]);
            tmp.emplace_back(nums[l++]);         
        }

        if(l == r)
            tmp.emplace_back(nums[l]);

        for(int i = 0; i < nums.size(); ++i) {
            nums[i] = tmp[i];
        }
    }
};
  • 1、这题也不难看前面思路就行。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值