六月集训(第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]);
}
}
};
东方欲晓,莫道君行早。

浙公网安备 33010602011771号