《算法集训传送门》
👉引言
铭记于心 | ||
---|---|---|
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉 |
💖
❄️我们的算法之路❄️💖
众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉
今日主题:贪心
👉⭐️第一题💎
✨题目
✨思路:
既然是贪心,那么就不能用平常思路去想,对于贪心题,就还是要勇敢去闯。这道题最关键的就是 ,只要扫描到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;
}
};
👉⭐️第二题💎
✨题目
这道题主要是“逻辑”运算,其实只需要统计完每个位置数的数量后,比较偶数个与奇数个位置数总和的大小,因为相差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);
}
};
👉⭐️第三题💎💎
✨题目
✨思路:
很有趣的一道贪心排序,关键在于 对每个人,将两个城市花费的差值进行从大到小排序,因为相差越多,就要先进行决策,先取其中的最小值,若是相差不多,那么就可以放后面决策,影响亦是不大
✨代码:
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;
}
};
👉⭐️第四题💎💎
✨题目
✨思路:
对原数组首先进行排序,然后只看局部,后前交替存放,注意这里的终止条件,要考虑到数个数为奇数时的情况
✨代码:
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
写在最后:
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫漫其修远兮,吾将上下而求索!伙伴们,明天见!