首页 > 其他分享 >[LeetCode] 1363. Largest Multiple of Three 形成三的最大倍数

[LeetCode] 1363. Largest Multiple of Three 形成三的最大倍数

时间:2024-01-11 13:59:06浏览次数:34  
标签:digits cnt Multiple 数字 rem1 sum Three 1363 rem2


Given an array of digits digits, return the largest multiple of three that can be formed by concatenating some of the given digits in any order. If there is no answer return an empty string.

Since the answer may not fit in an integer data type, return the answer as a string. Note that the returning answer must not contain unnecessary leading zeros.

Example 1:

Input: digits = [8,1,9]
Output: "981"

Example 2:

Input: digits = [8,6,7,1,0]
Output: "8760"

Example 3:

Input: digits = [1]
Output: ""

Constraints:

  • 1 <= digits.length <= 10^4
  • 0 <= digits[i] <= 9

这道题说是给了一个只含有数字0到9的数组 digits,现在说是可以在数组取出任意的数字,需要拼成一个3的倍数,返回可以拼出的最大的数字。根据题目中的例子不难理解题意,当然这里我们不能用暴力搜索的方法,比如找出所有的子集,然后判断是否能整除3,这种方法太不高效了,因为数字的个数最多有一万个,子集的个数太多了,不能一一验证。那么只能另辟蹊径,即然是要拼成3的倍数,在小学就应该学过能被3整除的数字的特性,就是每一位上的数字加起来也能被3整除,可以利用这个性质来做。

这里将数组中的每个数字都加起来,判断得到的数字之和对3取余,若能整除,说明每个数字都可以使用上,返回数字中就把大的放到前面就可以了。难点就在于如何处理不能整除的情况,这里的余数只有两种情况,1和2。若余数为1的话,最理想的情况就是直接去除掉一个1,但原数组中不一定有1,或者去掉一个4,或者7,都可以让余数为0。假如 1,4,7 这三个数字都不存在,那么只能考虑去除两个数字,比如2和2,2和5,或者5和8等等。同理,若余数为2的话,最理想的情况就是直接去除掉一个2,但原数组中不一定有2,或者去掉一个5,或者8,都可以让余数为0。假如 2,5,8 这三个数字都不存在,那么只能考虑去除两个数字,比如1和1,1和4,或者4和7等等。

分析到这里,应该就变得容易多了,新建两个数组 rem1 和 rem2,其中 rem1 中按顺序放入 1,4,7,2,5,8,rem2 中按顺序放入 2,5,8,1,4,7。为了快速知道某个数字是否存在,统计 digits 数组中每个数字出现的个数,可以用一个长度为 10 的数组 cnt 来统计0到9每个数字出现的次数,在统计的过程中同时计算出数组和 sum。接下来进行 while 循环,条件是 sum 对3取余不为0,然后用一个 for 循环遍历,按顺序从 rem1 或者 rem2 中取数验证,判断若 sum 对3取余的余数是1,并且此时的 rem1[i] 数字存在的话,则用 sum 减去 rem1[i],并且对应的在 cnt 中的计数自减1,这样的话就可以按顺序去尽可能的移除较小的数,从而使得余数变为0。同理,若 sum 对3取余的余数是2,并且此时的 rem2[i] 数字存在的话,则用 sum 减去 rem2[i],并且对应的在 cnt 中的计数自减1,参见代码如下:


class Solution {
public:
    string largestMultipleOfThree(vector<int>& digits) {
        string res;
        vector<int> rem1{1, 4, 7, 2, 5, 8}, rem2{2, 5, 8, 1, 4, 7}, cnt(10);
        int sum = 0;
        for (int digit : digits) {
            ++cnt[digit];
            sum += digit;
        }
        while (sum % 3 != 0) {
            for (int i = 0; i < 6; ++i) {
                if (sum % 3 == 1 && cnt[rem1[i]]) {
                    sum -= rem1[i];
                    --cnt[rem1[i]];
                    break;
                } else if (sum % 3 == 2 && cnt[rem2[i]]) {
                    sum -= rem2[i];
                    --cnt[rem2[i]];
                }
            }
        }
        for (int i = 9; i >= 0; --i) {
            res += string(cnt[i], '0' + i);
        }
        return res.size() && res[0] == '0' ? "0" : res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1363


参考资料:

https://leetcode.com/problems/largest-multiple-of-three/

https://leetcode.com/problems/largest-multiple-of-three/solutions/532860/simple-solution-with-brief-explanation-time-o-n-space-o-10-constant/


LeetCode All in One 题目讲解汇总(持续更新中...)

标签:digits,cnt,Multiple,数字,rem1,sum,Three,1363,rem2
From: https://www.cnblogs.com/grandyang/p/17958420

相关文章

  • Three.js——十五、Box3、相机动画、lookAt()视线方向、管道漫游案例、OrbitControls
    正投影相机正投影相机和透视相机的区别如果都以高处俯视去看整个场景,正投影相机就类似于2d的可视化的效果,透视相机就类似于人眼观察效果调整left,right,top,bottom范围大小如果你想整体预览全部立方体,就需要调整相机的渲染范围,比如设置上下左右的范围。使用场景:正投影可以......
  • Three.js 纹理贴图的实现
    在线工具推荐:3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.jsAI自动纹理开发包 - YOLO虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎纹理贴图简介当我们创建一个网格时,比如我们不起眼的立方体,我们传入两个组件:几......
  • Threejs——十四、关于深度冲突、重叠、以及加载模型进度条效果实现(附完整代码)
    深度冲突两个模型重叠的模型,通过浏览器旋转预览,会发现模型旋转的时候会发生闪烁。这种情况,主要是两个模型重合,电脑分不清谁在前谁在后,这种情况,可以理解为深度冲突Z-fighting。functionaddBox(){constgeometry=newTHREE.BoxGeometry(10,10,10);//材质constmater......
  • Three.js——十三、自定义大小画布、UI交互按钮以及3D场景交互、渲染画布为文件(图片)
    画布全屏以及自定义大小画布<!--canvas元素默认是行内块元素--><divclass="model"style="background-color:#ff0000;"width="300"height="180"></div>画布随窗口变化//画布跟随窗口变化window.onresize=function(){constwidth......
  • Three.js——十二、MeshPhysicalMaterial清漆层、粗糙度、物理材质透光率以及折射率(结
    环境贴图作用测试MeshPhysicalMaterial清漆层MeshPhysicalMaterial和MeshStandarMaterial都是拥有金属度metalness、粗糙度roughness属性的PBR材质,MeshPhysicalMaterial是MeshStandarMaterial的子集,除了继承了他的这些属性以外,还新增了清漆、透光率、反射率、光泽、折射率等等清漆......
  • 【可视化库对比】ECharts、AntV、D3和Three
    本文写作目的:大家在使用可视化库创作可视化作品的时候,可能会产生这样的问题:“现如今成熟的可视化库有这么多,我到底该选择哪一个呢?”这其实也是我在学习数据可视化课程的时候面临的一个问题。因此本文旨在对比上述广泛被使用到的4个前端可视化库:Echart、AntV、D3和Three,了解它们的......
  • VUE3 + Three.js 坑
    VUE3+Three.js坑1.问题描述将scene、camera、renderer、controls等变量用reactive变成响应式时,页面渲染会报错:three.module.js?5a89:24471UncaughtTypeError:'get'onproxy:property'modelViewMatrix'isaread-onlyandnon-configurabledatapropertyontheprox......
  • Three光源Target位置改变光照方向不变的问题及解决方法
    0x00楔子在Three.js中,光源的目标(target)是一种用于指定光源方向的重要元素。在聚光灯中和定向光(DirectionalLight)中都有用到。有时我们可能会遇到光源目标位置更新后,但光照方向未正确更新的问题。这个问题并不复杂,但是有时候出现了,往往会想不到原因。0x01原因出现这个问题的原......
  • 初见threejs
    threejs底层封装了强大的webGL技术,让开发者们可以开箱即用(其实也并非开箱即用,还是挺麻烦的......
  • Maven – Guide to using Multiple Repositories
     [Maven–GuidetousingMultipleRepositories](https://maven.apache.org/guides/mini/guide-multiple-repositories.html)PSD:\gitrepo\fairbeautycrm\fairbeauty-crm-test>mvn--versionApacheMaven3.9.6(bc0240f3c744dd6b6ec2920b3cd08dcc295161ae)Mave......