每日算法系列【LeetCode 1363】形成三的最大倍数
题目描述
给你一个整数数组 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】形成三的最大倍数相关推荐
- LeetCode 1363. 形成三的最大倍数(贪心,难)
1. 题目 给你一个整数数组 digits,你可以通过按任意顺序连接其中某些数字来形成 3 的倍数,请你返回所能得到的最大的 3 的倍数. 由于答案可能不在整数数据类型范围内,请以字符串形式返回答案. ...
- leetcode 1363 形成三的最大倍数(C++)
给你一个整数数组 digits,你可以通过按任意顺序连接其中某些数字来形成 3 的倍数,请你返回所能得到的最大的 3 的倍数. 由于答案可能不在整数数据类型范围内,请以字符串形式返回答案. 如果无法得 ...
- 重复次数最多的 子串_每日算法系列【LeetCode 424】替换后的最长重复字符
题目描述 给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次.在执行上述操作后,找到包含重复字母的最长子串的长度. 示例1 输入: s = &quo ...
- 算法系列之二:三只水桶等分水问题
算法系列之二: 三只水桶等分水问题 有一个容积为8升的水桶里装满了水,另外还有一个容积为3升的空桶和一个容积为5升的空桶,如何利用这两个空桶等分8升水?附加条件是三个水桶都没有体积刻度,也不能使用其它 ...
- 数组最大可以开多大_每日算法系列【LeetCode 689】三个无重叠子数组的最大和
题目描述 给定数组 由正整数组成,找到三个互不重叠的子数组的最大和. 每个子数组的长度为 ,我们要使这 个项的和最大化. 返回每个区间起始索引的列表(索引从 0 开始).如果有多个结果,返回字典序最小 ...
- 求栈中元素个数算法_每日算法系列【LeetCode 315】计算右侧小于当前元素的个数...
题目描述 给定一个整数数组 nums ,按要求返回一个新数组 counts .数组 counts 有该性质: counts[i] 的值是 nums[i] 右侧小于 nums[i] 的元素的数量. 示例 ...
- 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 523】连续的子数组和...
题目描述 给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数. 示例1 输入: [ ...
- 如何表示数组所有数都不等于一个数_每日算法系列【LeetCode 330】按要求补齐数组...
题目描述 给定一个已排序的正整数数组 nums ,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的 ...
- 序列复杂度怎么看_每日算法系列【LeetCode 376】摆动序列
题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...
- 找出最具竞争力的子序列_每日算法系列【LeetCode 376】摆动序列
题目描述 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个元素的序列也是摆动序列. 例如, [1,7,4,9,2,5] 是一个 ...
最新文章
- Linux常用命令及技巧4
- 同事结婚喽!发喜糖喽!心里酸溜溜的,哈哈....
- Spirng使用Aspectj实现AOP
- android wifi工作流程
- leetcode 506 相对名次
- 【FPGA】DS18B20温度显示
- 二进制与格雷码互相转换
- 如何激活Windows Server 2008 R2
- 从 radix tree 到 xarray
- 吃饭 睡觉 打豆豆游戏
- 软件测试精品书单推荐指南!
- date 减去固定时长_DATE_SUB() 函数从日期减去指定的时间间隔
- 苏宁商品详情API接口(商品详情页面数据接口)
- swfobject.js 详细解说
- 列几点一些软件或APP的Bug和对其建议
- 工作表格excel用python_Python自动化处理Excel报表,工作更轻松
- KingbaseES V8R6 集群运维案例 -- 磁盘空间问题导致集群故障
- Swiper轮播插件
- android应用开发 adb调测工具
- Windows Server 2016 文件操作系统 跨区卷 镜像卷 RAID5卷 ISCSI设置