买卖股票的最佳时机 II
题目
给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
122. 买卖股票的最佳时机 II - 力扣(LeetCode)
题解
class Solution {
public:
int maxProfit(vector<int>& prices) {
// 存储相邻两天的股票差价
vector<int> profit(prices.size() - 1, 0);
for(int i = 1; i < prices.size(); i++){
profit.push_back(prices[i] - prices[i - 1]);
}
int sum = 0;
// 累加所有正的利润,即为最大利润
for(int i = 0; i < profit.size(); i++){
if(profit[i] > 0){
sum += profit[i];
}
}
return sum;
}
};
跳跃游戏
题目
给你一个非负整数数组 nums
,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标,如果可以,返回 true
;否则,返回 false
。
55. 跳跃游戏 - 力扣(LeetCode)
题解
class Solution {
public:
bool canJump(vector<int>& nums) {
int cover = 0;
if(nums.size() <= 1) return true;
// 当前能够覆盖的最远距离
for(int i = 0; i <= cover; i++){
cover = max(i + nums[i], cover);
if(cover >= nums.size() - 1) return true;
}
// 遍历完之后,仍未覆盖所有的数组,返回false
return false;
}
};
跳跃游戏 II
题目
给定一个长度为 n
的 0 索引整数数组 nums
。初始位置为 nums[0]
。
每个元素 nums[i]
表示从索引 i
向前跳转的最大长度。换句话说,如果你在 nums[i]
处,你可以跳转到任意 nums[i + j]
处:
0 <= j <= nums[i]
i + j < n
返回到达 nums[n - 1]
的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]
。
45. 跳跃游戏 II - 力扣(LeetCode)
题解
class Solution {
public:
int jump(vector<int>& nums) {
if(nums.size() == 1) return 0;// 当只有一个元素的时候,不需要跳跃也是终点值
int curDistance = 0;
int nextDistance = 0;
int jumpSize = 0;
for(int i = 0; i < nums.size(); i++){
nextDistance = max(nums[i] + i, nextDistance);
if(i == curDistance){
jumpSize++;
curDistance = nextDistance;
if(nextDistance >= nums.size() - 1) break;
}
}
return jumpSize;
}
};
加油站
题目
在一条环路上有 n
个加油站,其中第 i
个加油站有汽油 gas[i]
升。
你有一辆油箱容量无限的的汽车,从第 i
个加油站开往第 i+1
个加油站需要消耗汽油 cost[i]
升。你从其中的一个加油站出发,开始时油箱为空。
给定两个整数数组 gas
和 cost
,如果你可以按顺序绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1
。如果存在解,则 保证 它是 唯一 的。
134. 加油站 - 力扣(LeetCode)
题解
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int amountOil = 0;
int min = INT_MAX;
// 第一次遍历,计算从起点到每个加油站的油量总和,并且更新最小值
for(int i = 0; i < gas.size(); i++){
amountOil += (gas[i] - cost[i]);
if (amountOil < min)
{
min = amountOil;// 更新最小值
}
}
// 如果最小值大于等于0,说明一定存在解,而且0就是答案
if(min >= 0) return 0;
// 如果总油量少于0,那么一定跑不了全程
if(amountOil < 0) return -1;
// 找到从哪个加油站开始能够走完全程
for(int i = gas.size() - 1; i >= 0; i--){
min += (gas[i] - cost[i]);
if(min >= 0) return i;
}
return -1;
}
};
分发糖果
题目
n
个孩子站成一排。给你一个整数数组 ratings
表示每个孩子的评分。
你需要按照以下要求,给这些孩子分发糖果:
- 每个孩子至少分配到
1
个糖果。 - 相邻两个孩子评分更高的孩子会获得更多的糖果。
请你给每个孩子分发糖果,计算并返回需要准备的 最少糖果数目 。
135. 分发糖果 - 力扣(LeetCode)
题解
从前向后遍历->从后向前遍历
class Solution {
public:
int candy(vector<int>& ratings) {
// 存储孩子分到的糖果数,初始化为1,每个孩子至少分到一个糖果
vector<int> candySum(ratings.size(), 1);
// 第一遍遍历,从左往右,确保比左边评分高的孩子得到更多的糖果
for(int i = 1; i < ratings.size(); i++){
if(ratings[i - 1] < ratings[i]){
candySum[i] = candySum[i - 1] + 1;
}
}
// 第二遍遍历,从右往左,确保比右边评分高的孩子分到更多的糖果
for(int i = ratings.size() - 2; i >= 0; i--){
if(ratings[i] > ratings[i + 1]){
// 比较右边孩子的糖果数加1和当前孩子的糖果数
// 取其中的较大值,确保比右边评分高的孩子分到更多的糖果
candySum[i] = max(candySum[i + 1] + 1, candySum[i]);
}
}
return accumulate(candySum.begin(), candySum.end(), 0);
}
};
根据身高重建队列
题目
假设有打乱顺序的一群人站成一个队列,数组 people
表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki]
表示第 i
个人的身高为 hi
,前面 正好 有 ki
个身高大于或等于 hi
的人。
请你重新构造并返回输入数组 people
所表示的队列。返回的队列应该格式化为数组 queue
,其中 queue[j] = [hj, kj]
是队列中第 j
个人的属性(queue[0]
是排在队列前面的人)。
406. 根据身高重建队列 - 力扣(LeetCode)
题解 – vector文章来源:https://www.toymoban.com/news/detail-841827.html
class Solution {
public:
"""
在这个比较函数中,首先比较两个人的身高(a[0]和b[0]表示两人的身高);
如果身高相同,则按照前面的人数(a[1]和b[1]表示两人前面的人数)升序排列;
如果身高不同,则按照身高降序排列。
"""
static bool cmp(const vector<int>& a, const vector<int>& b){
if(a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);
vector<vector<int>> queue;
for(int i = 0; i < people.size(); i++){
int position = people[i][1];
// 将当前人插入到que向量中的合适位置,保证队列的前面有正确数量的人。
queue.insert(queue.begin() + position, people[i]);
}
return queue;
}
};
题解 — list文章来源地址https://www.toymoban.com/news/detail-841827.html
class Solution {
public:
static bool cmp(const vector<int>& a, const vector<int>& b){
if(a[0] == b[0]) return a[1] < b[1];
return a[0] > b[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);
list<vector<int>> queue;
for(int i = 0; i < people.size(); i++){
int position = people[i][1];
list<vector<int>>::iterator it = queue.begin();
while(position--){
it++;
}
queue.insert(it, people[i]);
}
return vector<vector<int>> (queue.begin(), queue.end());
}
};
到了这里,关于重拾C++之菜鸟刷算法第15篇 --- 贪心算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!