当前位置: 首页 > news >正文

字节青训Marscode_5:寻找最大葫芦——最新题解

步骤1:问题定义与分析

  1. 输入条件:

    • 整数n:牌的数量
    • 整数max:葫芦牌面值之和的上限
    • 数组array:n张牌的牌面值
  2. 输出条件:

    • 两个整数组成的数组[a,b]:
      • a表示三张相同牌的牌面值
      • b表示两张相同牌的牌面值
    • 如果不存在符合条件的葫芦,返回[0,0]
  3. 限制条件:

    • 牌面值规则:A(1) < 2 < 3 < ... < 10 < J(11) < Q(12) < K(13)
    • 3×a + 2×b ≤ max
    • 需要找到最大的有效组合(先比较三张牌的大小,再比较两张牌的大小)
  4. 边界条件:

    • 输入数组中没有足够的相同牌组成葫芦
    • 所有可能的组合都超过max值
    • 输入数组为空或长度不足

步骤2:算法设计与分析

最优解决方案:贪心算法

  1. 统计每个牌面值出现的次数
  2. 分别找出可以作为三张牌和两张牌的候选值
  3. 对候选值排序后,采用贪心策略寻找最优解

时间复杂度分析:

  • 统计频次:O(n)
  • 排序候选值:O(k log k),其中k为不同牌面值的数量
  • 寻找最优解:O(k²) 总体时间复杂度:O(n + k² + k log k),其中k ≤ 13

空间复杂度:O(k),用于存储频次统计和候选值

#include <algorithm>
#include <iostream>
#include <unordered_map>
#include <vector>// 用于比较牌面大小的辅助函数
int getCompareValue(int card) {// A牌(值为1)在比较时应该是最大的return card == 1 ? 14 : card;
}// 用于计算和的辅助函数
int getSumValue(int card) {// 计算和时使用原始值return card;
}
std::vector<int> solution(int n, int max, const std::vector<int>& array) {// 特殊情况处理if (n < 5) return {0, 0};// 统计频次std::unordered_map<int, int> countMap;for (int card : array) {countMap[card]++;}// 收集候选值std::vector<int> triples, pairs;for (const auto& [card, count] : countMap) {// 注意:一个牌面值如果出现4次,既可以用作triple也可以用作pairif (count >= 3) {triples.push_back(card);}if (count >= 2) {pairs.push_back(card);}}// 验证是否有足够的候选值if (triples.empty() || pairs.empty()) {return {0, 0};}// 对候选值进行排序(考虑A牌的特殊性)auto compareCards = [](int a, int b) {int valueA = (a == 1) ? 14 : a;  // A牌特殊处理int valueB = (b == 1) ? 14 : b;return valueA > valueB;};std::sort(triples.begin(), triples.end(), compareCards);std::sort(pairs.begin(), pairs.end(), compareCards);// 寻找最优组合int bestTriple = 0, bestPair = 0;for (int triple : triples) {for (int pair : pairs) {// 跳过使用同一个牌面值的情况if (triple == pair) continue;// 检查是否满足最大值限制int sum = 3 * triple + 2 * pair;if (sum <= max) {// 找到一个有效组合bestTriple = triple;bestPair = pair;goto found;  // 由于已排序,第一个找到的就是最优解}}}found:return bestTriple > 0 ? std::vector<int>{bestTriple, bestPair} : std::vector<int>{0, 0};
}

步骤4:解题启发

  1. 值的二元性处理:

    • 分离比较逻辑和计算逻辑
    • 使用辅助函数明确区分不同场景下的值处理
  2. 排序策略的灵活运用:

    • 自定义比较函数处理特殊规则
    • 保持原始值用于计算约束
  3. 优化空间的发现:

    • A牌的特殊性质提供了独特的优化机会
    • 在满足约束的同时最大化结果
  1. 金融交易系统:
    struct Transaction {double nominalValue;     // 面值double tradingValue;     // 交易值double getValueForRisk() {// 风险计算使用面值return nominalValue;}double getValueForTrading() {// 交易使用交易值return tradingValue;}
    };
  2. 商品定价系统:
    class Product {double costPrice;        // 成本价double marketPrice;      // 市场价double getPriceForInventory() {// 库存估值使用成本价return costPrice;}double getPriceForSale() {// 销售使用市场价return marketPrice;}
    };

http://www.lryc.cn/news/495204.html

相关文章:

  • MySQL —— MySQL 程序
  • LLamafactory API部署与使用异步方式 API 调用优化大模型推理效率
  • 不玩PS抠图了,改玩Python抠图
  • 三维渲染中顺序无关的半透明混合(OIT)(一Depth Peeling)
  • Linux零基础入门--Makefile和make--纯干货无废话!!
  • vim编辑器的一些配置和快捷键
  • 电子应用设计方案-31:智能AI音响系统方案设计
  • 【设计模式】【结构型模式(Structural Patterns)】之装饰模式(Decorator Pattern)
  • 【AI】JetsonNano启动时报错:soctherm OC ALARM
  • QT:生成二维码 QRCode
  • 【LeetCode刷题之路】120:三角形最小路径和的两种解法(动态规划优化)
  • 神经网络中常见的激活函数Sigmoid、Tanh和ReLU
  • 适用于学校、医院等低压用电场所的智能安全配电装置
  • 基于python爬虫的智慧人才数据分析系统
  • LeetCode-315. Count of Smaller Numbers After Self
  • 根据导数的定义计算导函数
  • WPF关于打开新窗口获取数据的回调方法的两种方式
  • 复杂网络(四)
  • 用MATLAB符号工具建立机器人的动力学模型
  • SQL优化与性能——数据库设计优化
  • FPGA存在的意义:为什么adc连续采样需要fpga来做,而不会直接用iic来实现
  • 我们来学mysql -- 事务之概念(原理篇)
  • 基于特征子空间的高维异常检测:一种高效且可解释的方法
  • 看不见的彼方:交换空间——小菜一碟
  • YOLO模型训练后的best.pt和last.pt区别
  • Pareidoscope - 语言结构关联工具
  • GPT(Generative Pre-trained Transformer) 和 Transformer的比较
  • 软件无线电(SDR)的架构及相关术语
  • Python将Excel文件转换为JSON文件
  • 排序算法之选择排序篇