【算法集训专题攻克篇 】第四篇之贪心

算法集训传送门

  👉引言

在这里插入图片描述

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

💖 ❄️我们的算法之路❄️💖

   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
              ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
   💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉


今日主题:贪心


 👉⭐️第一题💎

   ✨题目

      1221. 分割平衡字符串

   ✨思路

既然是贪心,那么就不能用平常思路去想,对于贪心题,就还是要勇敢去闯。这道题最关键的就是 ,只要扫描到R与L相等,就马上切一刀,不要管后面还有没有,切就是了,最后切的刀数就是结果

   ✨代码
class Solution {
public:
int balancedStringSplit(string s) {
	int l = 0;
	int r = 0;
	int res = 0;
	for (char tem : s) {
		tem == 'R' ? r++:l++;
		if (abs(l - r) ==0) {
			res++;
			l = 0; r = 0;
		}
	}
	return res;
}
};

 👉⭐️第二题💎

   ✨题目

      1217. 玩筹码

这道题主要是“逻辑”运算,其实只需要统计完每个位置数的数量后,比较偶数个与奇数个位置数总和的大小,因为相差2个位置不需要花费,也就是说是等效的

   ✨代码
class Solution {
public:
    int minCostToMoveChips(vector<int>& position) {
	map<int, int>ans;
	for (int i : position) {
		ans[i]++;
	}
	int ou=0;
	int ji = 0;
	for (map<int, int>::iterator it = ans.begin(); it != ans.end(); it++) {
		if ((it->first & 1) == 1) {
			ji += it->second;
		}
		else {
			ou += it->second;
		}
	}
	return min(ji, ou);
}
};

 👉⭐️第三题💎💎

   ✨题目

      1029. 两地调度

   ✨思路

很有趣的一道贪心排序,关键在于 对每个人,将两个城市花费的差值进行从大到小排序,因为相差越多,就要先进行决策,先取其中的最小值,若是相差不多,那么就可以放后面决策,影响亦是不大

   ✨代码
class Solution {
public:
    int twoCitySchedCost(vector<vector<int>>& costs) {
	int fA=0,fB=0;
	int sum = 0;
	int n = costs.size() >>1;
	sort(costs.begin(), costs.end(), [](vector<int>t1, vector<int>t2) {return(abs(t1[0] - t1[1]) > abs(t2[0] - t2[1])); });
	for (vector<int>tem : costs) {
		tem[0] < tem[1] ?
			fA >= n ? (fB++,sum+=tem[1]) : (fA++, sum += tem[0]) :
			fB>=n? (fA++, sum += tem[0]) : (fB++, sum += tem[1]);
	}
	return sum;
}
};

 👉⭐️第四题💎💎

   ✨题目

      面试题 10.11. 峰与谷

   ✨思路

对原数组首先进行排序,然后只看局部,后前交替存放,注意这里的终止条件,要考虑到数个数为奇数时的情况

   ✨代码
class Solution {
public:
void wiggleSort(vector<int>& nums) {
	sort(nums.begin(), nums.end());
	vector<int>ans; int f = 1;
	int n = nums.size() - 1;
	for (int i = 0; i < nums.size()/2.0; i++) {
			ans.push_back(nums[n - i]);
			if (n - i == i)continue;
			ans.push_back(nums[i]);
	}
	nums = ans;
}
};

  ⭐️总结⭐️

其实贪心题更多不是代码能力,而是思维能力,多去尝试,多去想,走自然的智慧,拿自然的AC

写在最后
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦想new的出来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值