🙊本文目录👍
🙊写在前面🙊
贪心思路是有,就是贪不出来 ,果然还是缺乏练习,一大早起来看了三叶姐姐的解题思路豁然开朗~
题目
示例
示例1:
输入:a = 1, b = 1, c = 7
输出:"ccaccbcc"
解释:"ccbccacc" 也是一种正确答案。
示例2:
输入:a = 2, b = 2, c = 1
输出:"aabbc"
示例3:
输入:a = 7, b = 1, c = 0
输出:"aabaa"
解释:这是该测试用例的唯一正确答案。
提示
0 <= a, b, c <= 100
a + b + c > 0
📝思路📝
本题考查知识点
贪心
:那我们需要贪些什么呢?我们很容易想到的就是每次取当前剩余个数最多
的字符来进行拼凑,但是还要满足不能连续出现三个一样的字符
。
优先队列大根堆
: 这里可以结合优先队列来进行解题,将字符以数组[字符编号,字符剩余数量]
的方式进行存储,在对其 以 字符剩余数量 从大到小
进行排序。—— [【宫水三叶】结合优先队列的贪心运用题](【宫水三叶】结合优先队列的贪心运用题 - 最长快乐字符串 - 力扣(LeetCode) (leetcode-cn.com))
该方法主要是通过当结果中字符数量>=2时 ,进行判断其加入的第三个剩余数量的字符与前两个字符是一致连续相同的时,其就要考虑第二个剩余数量最多的字符来进行拼接,如此循环使其能达到 a = b = c > 0剩余数量的平衡之后,即可abcabc…的循环打印结果。
⭐代码实现⭐
暴力AC法
class Solution {
public String longestDiverseString(int a, int b, int c) {
// 初始化优先队列,以[字符编号,字符剩余数量] 存储 进行排序 使得字符剩余数量从大到小的(大根堆)排序
PriorityQueue<int []> sortQueue = new PriorityQueue<>((x,y)->y[1] - x[1]);
// 初始化存储数据的大根堆
if (a>0)sortQueue.add(new int []{0,a});
if (b>0)sortQueue.add(new int []{1,b});
if (c>0)sortQueue.add(new int []{2,c});
StringBuilder res = new StringBuilder();
while (!sortQueue.isEmpty()){
// 取出当前字符剩余数量最大的元素
int[] cur = sortQueue.poll();
//当前结果长度
int n = res.length();
//如果长度大于等于2时,则需要对当前取出的剩余数量最大的元素与前两个元素是否一致且连续相同
if (n >=2 && res.charAt(n-1) - 'a' == cur[0] && res.charAt(n-2) - 'a' == cur[0]){
//如果是连续相同的 我们需要进行第一次判断当前队列中是否还有剩余数量的其他字符, 也就是说为了我们找到第二大剩余字符数量的字符
if (sortQueue.isEmpty())break;
//取出当前第二大的剩余数量的字符
int[] next = sortQueue.poll();
//将其拼接至结果
res.append((char)(next[0] + 'a'));
//如果拼接字符的剩余数量不为0时咱们再把它添加到大根堆中再次排序
if (--next[1] != 0)sortQueue.add(next);
//因为没有用到当前字符,所以原封不动将其也返回到大根堆中进行排序
sortQueue.add(cur);
}else{
//如果不是连续相同的咱们就把它 直接拼接入结果
res.append((char)(cur[0]+'a'));
//判断当前字符是否还有剩余数量 如果有咱们就把它重新放回堆中排序
if (--cur[1] != 0)sortQueue.add(cur);
}
}
return res.toString();
}
}
运行结果
贪心 + 优先队列
🙊写在最后🙊
2022-2-7今天小付打卡了哦~
今天是大年初七,一定要吃好多好吃的哦~
美好的日出 美好的山河
都因有你存在 而璀璨 耀眼