前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是六月集训第四天:贪心
一、练习题目
二、算法思路
- 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、这题也不难看前面思路就行。