- 134.加油站
- 455.分发饼干
- 860.柠檬水找零
- 2171.拿出最少数目的魔法豆
134.加油站
javascript
复制代码
/**
* @param {number[]} gas
* @param {number[]} cost
* @return {number}
*/
// 思路
// 判断: 汽油和 < 消耗和 return -1
// while循环遍历 从0开始, 计算是否有剩余 ,有就继续 没有就从下个点开始
// 不是绕一圈吗, 没看到代码
var canCompleteCircuit = function (gas, cost) {
// 先判断是否有值
let remainGas = 0;
for (let i = 0; i < gas.length; i++) {
remainGas += gas[i] - cost[i];
}
if (remainGas < 0) return -1;
//
let i = 0;
let index = 0;
let currentGas = 0;
// 遍历循环
while (i < gas.length) {
currentGas += gas[i] - cost[i];
// console.log("i, curgas", i, currentGas);
// 大于等于都算
if (currentGas >= 0) {
i += 1;
} else {
// console.log("上面不通, 下一个加油站");
// 出发时的加油站编号, 索引
index = i + 1;
// 邮箱清0
currentGas = 0;
// 从下一个开始开发
i += 1;
}
}
return index;
};
console.log(canCompleteCircuit([1, 2, 3, 4, 5], [3, 4, 5, 1, 2]));
console.log(canCompleteCircuit([2, 3, 4], [3, 4, 3]));
// 输入: gas = [1,2,3,4,5], cost = [3,4,5,1,2]
// 输出: 3
// 输入: gas = [2,3,4], cost = [3,4,3]
// 输出: -1
455.分发饼干
javascript
复制代码
/**
* @param {number[]} g
* @param {number[]} s
* @return {number}
*/
// 思路
// 小孩排序
// 饼干排序
// while 饼干 < 饼干长度
// 如果 饼干
var findContentChildren = function (g, s) {
// 排序
g.sort();
s.sort();
let child = 0;
let cookie = 0;
while (cookie < s.length) {
// 饼干尺寸大于等于 还是胃口欲望值
if (s[cookie] >= g[child]) {
child += 1;
}
cookie += 1;
}
return child;
};
// 输入: g = [1,2,3], s = [1,1]
// 输出: 1
860.柠檬水找零
javascript
复制代码
/**
* @param {number[]} bills
* @return {boolean}
*/
// 思路
// 定义 5元和10元 数量
// for遍历账单 分3种场景
// 1: 5元 -> 5元数量++
// 2: 10元 -> if 有5元 10元++ 否则 false
// 3: 20元 -> if 有5元且有10元 5元-- 10元-- 否则 如果有5元数量>3 5元-=3 否则false
// 末尾返回true
var lemonadeChange = function (bills) {
let five = 0;
let ten = 0;
for (let i = 0; i < bills.length; i++) {
// 5元场景
if (bills[i] === 5) {
five += 1;
// 10元场景
} else if (bills[i] === 10) {
if (five > 0) {
ten += 1;
five -= 1;
} else {
return false;
}
} else {
if (ten > 0 && five > 0) {
ten -= 1;
five -= 1;
} else {
// 3张5元可以替换
if (five >= 3) {
five -= 3;
}
// 其他情况都是false
else return false;
}
}
}
return true;
};
console.log(lemonadeChange([5, 5, 5, 10, 20]));
// 输入:bills = [5,5,5,10,20]
// 输出:true
2171.拿出最少数目的魔法豆
javascript
复制代码
/**
* @param {number[]} beans
* @return {number}
*/
// 思路
// 数组计算综合 并升序
// for循环遍历
// 关键计算方式:ans = Math.min(ans, sum - beans[i] * (beans.length - i));
var minimumRemoval = function (beans) {
const sum = beans.reduce((x, y) => x + y, 0);
beans.sort((a, b) => a - b);
console.log(beans);
let ans = sum;
// 对于第个袋子 k, bean 个豆子,左边部分必须全部取出(小于等于),右边部分必须变成(大于等于) bean。可以用总和减去 bean * (beans.length - k)
// 对于第k个袋子, 把k袋后面的每个袋子 - k袋的数量 最小数目= 总和- k袋大小* k袋后面的数量
for (let i = 0; i < beans.length; i++) {
ans = Math.min(ans, sum - beans[i] * (beans.length - i));
}
console.log(ans);
return ans;
};
minimumRemoval([4, 1, 6, 5]);
// [ 1, 4, 5, 6 ]
// i 0 12 12
// i 1 4 4
// i 2 6 4
// i 3 10 4
// 示例 1:
// 输入:beans = [4,1,6,5]
// 输出:4
// 解释:
// - 我们从有 1 个魔法豆的袋子中拿出 1 颗魔法豆。
// 剩下袋子中魔法豆的数目为:[4,0,6,5]
// - 然后我们从有 6 个魔法豆的袋子中拿出 2 个魔法豆。
// 剩下袋子中魔法豆的数目为:[4,0,4,5]
// - 然后我们从有 5 个魔法豆的袋子中拿出 1 个魔法豆。
// 剩下袋子中魔法豆的数目为:[4,0,4,4]
// 总共拿出了 1 + 2 + 1 = 4 个魔法豆,剩下非空袋子中魔法豆的数目相等。
// 没有比取出 4 个魔法豆更少的方案。