题目描述

给你一个整数数组 digits,你可以通过按任意顺序连接其中某些数字来形成 3 的倍数,请你返回所能得到的最大的 3 的倍数。

由于答案可能不在整数数据类型范围内,请以字符串形式返回答案。

如果无法得到答案,请返回一个空字符串。

示例1

        输入:
digits = [8,1,9]
输出:
"981"

示例2

        输入:
digits = [8,6,7,1,0]
输出:
"8760"

示例3

        输入:
digits = [1]
输出:
""

示例4

        输入:
digits = [0,0,0,0,0,0]
输出:
"0"

提示

  • 1 <= digits.length <= 10^4
  • 0 <= digits[i] <= 9
  • 返回的结果不应包含不必要的前导零。

题解

首先要知道一个小学生都知道的定理:如果一个数可以被 整除,那么它的每一位上的数之和也可以被 整除,反之也成立。

那么问题就转化为了挑选出最多的数,使得和是 的倍数。我们可以先求出所有数之和,记为 ,然后有如下三种情况:

  • 如果 ,那么所有数都选中就行了。
  • 如果 ,那么必须删掉一个模 的数(按照从小到大顺序删除 1、4、7)。如果这三个数都没有,那就要删除两个模 的数(按照从小到大顺序删除 2、5、8,删除两次)。
  • 如果 ,那么必须删掉一个模 的数(按照从小到大顺序删除 2、5、8)。如果这三个数都没有,那就要删除两个模 的数(按照从小到大顺序删除 1、4、7,删除两次)。

最终将剩下的数按照从小到大顺序排序,拼接在一起就行了。

注意如果有前导 ,就说明答案就是

时间复杂度为

代码

c++

        class Solution {public:int del(vector<int>& cnt, int q) {for (int i = 0; i <= 9; ++i) {if (i%3 == q && cnt[i]) {return --cnt[i];}}return -1;}string largestMultipleOfThree(vector<int>& digits) {vector<int> cnt(10, 0);int sum = 0;for (auto x : digits) {cnt[x]++;sum += x;}int q = sum % 3;if (q && del(cnt, q) < 0) {del(cnt, 3-q);del(cnt, 3-q);}string res = "";for (int i = 9; i >= 0; --i) {while (cnt[i]--) {res += i+'0';}}if (res.size() && res[0] == '0') return "0";return res;}
};

每日算法系列【LeetCode 1363】形成三的最大倍数相关推荐

  1. LeetCode 1363. 形成三的最大倍数(贪心,难)

    1. 题目 给你一个整数数组 digits,你可以通过按任意顺序连接其中某些数字来形成 3 的倍数,请你返回所能得到的最大的 3 的倍数. 由于答案可能不在整数数据类型范围内,请以字符串形式返回答案. ...

  2. leetcode 1363 形成三的最大倍数(C++)

    给你一个整数数组 digits,你可以通过按任意顺序连接其中某些数字来形成 3 的倍数,请你返回所能得到的最大的 3 的倍数. 由于答案可能不在整数数据类型范围内,请以字符串形式返回答案. 如果无法得 ...

  3. 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符

    题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...

  4. 算法系列之二:三只水桶等分水问题

    算法系列之二: 三只水桶等分水问题 有一个容积为8升的水桶里装满了水,另外还有一个容积为3升的空桶和一个容积为5升的空桶,如何利用这两个空桶等分8升水?附加条件是三个水桶都没有体积刻度,也不能使用其它 ...

  5. 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和

    题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...

  6. 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...

    题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...

  7. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...

    题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...

  8. 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...

    题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...

  9. 序列复杂度怎么看_每日算法系列【LeetCode 376】摆动序列

    题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

  10. 找出最具竞争力的子序列_每日算法系列【LeetCode 376】摆动序列

    题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...

最新文章

  1. Linux常用命令及技巧4
  2. 同事结婚喽!发喜糖喽!心里酸溜溜的,哈哈....
  3. Spirng使用Aspectj实现AOP
  4. android wifi工作流程
  5. leetcode 506 相对名次
  6. 【FPGA】DS18B20温度显示
  7. 二进制与格雷码互相转换
  8. 如何激活Windows Server 2008 R2
  9. 从 radix tree 到 xarray
  10. 吃饭 睡觉 打豆豆游戏
  11. 软件测试精品书单推荐指南!
  12. date 减去固定时长_DATE_SUB() 函数从日期减去指定的时间间隔
  13. 苏宁商品详情API接口(商品详情页面数据接口)
  14. swfobject.js 详细解说
  15. 列几点一些软件或APP的Bug和对其建议
  16. 工作表格excel用python_Python自动化处理Excel报表,工作更轻松
  17. KingbaseES V8R6 集群运维案例 -- 磁盘空间问题导致集群故障
  18. Swiper轮播插件
  19. android应用开发 adb调测工具
  20. Windows Server 2016 文件操作系统 跨区卷 镜像卷 RAID5卷 ISCSI设置

热门文章

  1. delphi让exe开机自启动
  2. memcached学习笔记(1)——memcached原理
  3. 常用排序算法之插入排序 ( 直接插入排序、希尔排序 )
  4. 利用 Arrays.sort 字符串 进行排序 完全按字符 排序 忽略字符大小写
  5. TCP传输的三次握手四次挥手策略
  6. mysqljoin的原理和优化
  7. 用create table 命令建立表
  8. LoadRunner去除事物中的程序的执行时间
  9. 数学图形(2.1)三叶结
  10. 如何保证数据库结构的合理性(三、建立可靠的关系)