前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 1363. 形成三的最大倍数(贪心,难)

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

作者头像
Michael阿明
发布2020-07-13 16:00:36
6970
发布2020-07-13 16:00:36
举报

1. 题目

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

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

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

代码语言:javascript
复制
示例 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
返回的结果不应包含不必要的前导零。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/largest-multiple-of-three 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

容易错的数据:

代码语言:javascript
复制
[9,8,6,8,6]
[2,2,1,1,1]
[1,1,1,2]
[5,8]

2. 解题

  • 把所有数加起来和为sum,总的字符串降序排序,然后sum%3,看余数
  • 等于0,直接返回
  • 等于1,优先删除1个1 or 4 or 7,没有的话,删除2,5,8中最小的2个
  • 等于2,优先删除1个2 or 5 or 8,没有的话,删除1,4,7中最小的2个
代码语言:javascript
复制
class Solution {
public:
    string largestMultipleOfThree(vector<int>& digits) {
    	int count[10] = {0}, i, sum = 0, time;
    	string ans;	
    	for(i = 0; i < digits.size(); ++i)
    	{
    		count[digits[i]]++;//计数
    		sum += digits[i];//总和
    		ans += digits[i]+'0';//字符串
    	}
    	sort(ans.begin(), ans.end(),[](char& a, char& b){return a > b;});
		if(sum%3 == 1)
    	{
    		i = ans.size()-1;
    		if(count[1]!=0||count[4]!=0||count[7]!=0)
    		{
    			for( ; i>=0; --i)
	    		{
	    			if(ans[i]=='1'||ans[i]=='4'||ans[i]=='7')
	    			{
	    				ans.erase(ans.begin()+i);
	    				break;
	    			}
	    		}
    		}
    		else
    		{	
    			time = 2;
    			for( ; i>=0; --i)
    			{
    				if(ans[i]=='2'||ans[i]=='5'||ans[i]=='8')
	    			{
	    				ans.erase(ans.begin()+i);
	    				time--;
	    				if(time == 0)
	    					break;
	    			}
    			}
    		}
    	}
    	else if(sum%3 == 2)
    	{
    		i = ans.size()-1;
    		if(count[2]!=0||count[5]!=0||count[8]!=0)
    		{
    			for( ; i>=0; --i)
	    		{
	    			if(ans[i]=='2'||ans[i]=='5'||ans[i]=='8')
	    			{
	    				ans.erase(ans.begin()+i);
	    				break;
	    			}
	    		}
    		}
    		else
    		{	
    			time = 2;
    			for( ; i>=0; --i)
    			{
    				if(ans[i]=='1'||ans[i]=='4'||ans[i]=='7')
	    			{
	    				ans.erase(ans.begin()+i);
	    				time--;
	    				if(time == 0)
	    					break;
	    			}
    			}
    		}
		}
		if(ans != "" && ans[0]=='0')
			return "0";
		return ans;
	}
};
在这里插入图片描述
在这里插入图片描述

大佬优美解:

代码语言:javascript
复制
class Solution {
    int cnt[10], sum;
    string ans = "";
    set<int> s;
    int del(int m)
    {
        for(int i=m;i<=9;i+=3)
        	if(cnt[i])
        	{
        		cnt[i]--;
        		return 1;
       		}
        return 0;
    }
public:
    string largestMultipleOfThree(vector<int>& d) {
        for(auto x:d)
        	cnt[x]++, sum += x;
        if(sum%3==1)
        	if(!del(1))
        		del(2),del(2);
        if(sum%3==2)
        	if(!del(2))
        		del(1),del(1);
        for(int i=9; i>=0; i--)
        	while(cnt[i]--)
        		ans += i+'0', s.insert(i);
        if(s.size()==1 && s.count(0))
        	return "0";// [1,0,0] -> "0"
        return ans;
    }
};

作者:YusenZhang_chatc
链接:https://leetcode-cn.com/problems/largest-multiple-of-three/solution/c-qu-diao-zui-xiao-zhi-8ms-by-yusenzhang_chatc/
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档