代码随想录算法训练营 Day29 贪心Ⅲ 加油站 糖果 找零 重建队列

贪心

题目

134. 加油站 - 力扣(LeetCode)
计算累加油量,当累加油量出现负数,说明之前任何地方都不够,开启新的位置
代码随想录算法训练营 Day29 贪心Ⅲ 加油站 糖果 找零 重建队列_第1张图片

int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
	int curIdx = 0;
	int curSum = 0;
	int totalSum = 0;
	for (int i = 0; i < gas.size(); ++i) {
		curSum += gas[i] - cost[i];
		totalSum += gas[i] - cost[i]; // 统计当前 与 全局的净油量
		if (curSum < 0) {
			// 说明当前索引及其之前都不行
			curIdx = i + 1;
			curSum = 0;
		}
	}
	// 全局小于0说明没有路径
	if (totalSum < 0) return -1;
	return curIdx;
}

135. 分发糖果 - 力扣(LeetCode)
先确定一边情况,再确定另一边情况,右边情况需要逆顺序遍历
可以用两个数组盛放数据,然后求最大值即可,或者第一遍记录,第二遍判断取最大

int candy(vector<int>& ratings) {
	// 默认给1个糖果
	int minSum = 0;
	std::vector<int> candy(ratings.size(), 1);
	// 比较左边孩子决定是否给糖果
	for (int i = 1; i < ratings.size(); ++i) {
		// 当前比左边评分高 要比左边多一个糖果
		if (ratings[i] > ratings[i-1]) {
			candy[i] = candy[i-1] + 1;
		}
	}
	// 比较右边孩子决定是否给糖果
	for (int i = ratings.size() - 2; i >= 0; i--) {
		// 当前比右边的高 比右边多给一个糖果
		if (ratings[i] > ratings[i+1]) {
			candy[i] = std::max(candy[i+1] + 1, candy[i]);
		}
	}
	for (int i = 0; i < ratings.size(); ++i) minSum += candy[i];
	return minSum;
}

860. 柠檬水找零 - 力扣(LeetCode)
场景分析 1 5 元收下 2 10 元找零 5 元 3 20 找零 10 5 元,遇到 20 优先消耗 10
分析题目按照逻辑解决即可

bool lemonadeChange(vector<int>& bills) {
	int five = 0, ten = 0;
	for (int i = 0; i < bills.size(); ++i) {
		// 收到5
		if (bills[i] == 5) five++;
		// 收到10
		if (bills[i] == 10) {
			if (five <= 0) return false;
			five--;
			ten++;
		}
		// 收到20
		if (bills[i] == 20) {
			if (five > 0 && ten > 0) {
				ten--;
				five--;
			}
			else if (five >= 3) five -= 3;
			else return false;
		}
	}
	return true;
}

406. 根据身高重建队列 - 力扣(LeetCode)
类似于发糖果,两种顺序处理左右情况,确定一个维度后再确定一个维度
按照身高排序,然后根据数据 k 对身高部分进行插入

static bool Cmp(const vector<int>& a, const vector<int>& b) {
	// 身高相同 k越小排在前面
	if(a[0] == b[0]) return a[1] < b[1];
	return a[0] > b[0]; // 从大到小排序
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
	std::sort(people.begin(), people.end(), Cmp);
	list<vector<int>> que;
	for (int i = 0; i < people.size(); ++i) {
	    // 确定插入位置
		int pos = people[i][1];
		std::list<std::vector<int>>::iterator it = que.begin();
		while (pos--) it++;
		que.insert(it, people[i]);
	}
	return vector<std::vector<int>>(que.begin(), que.end());
}

你可能感兴趣的:(算法)