算法| ss 贪心

  • 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 个魔法豆更少的方案。
相关推荐
xiaoshiguang318 分钟前
LeetCode:222.完全二叉树节点的数量
算法·leetcode
爱吃西瓜的小菜鸡20 分钟前
【C语言】判断回文
c语言·学习·算法
别NULL22 分钟前
机试题——疯长的草
数据结构·c++·算法
TT哇26 分钟前
*【每日一题 提高题】[蓝桥杯 2022 国 A] 选素数
java·算法·蓝桥杯
yuanbenshidiaos2 小时前
C++----------函数的调用机制
java·c++·算法
唐叔在学习2 小时前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA2 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo2 小时前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc2 小时前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
游是水里的游4 小时前
【算法day20】回溯:子集与全排列问题
算法