[Algorithm][贪心][可被三整除的最大和][距离相等的条形码][重构字符串]详细讲解

server/2024/10/16 2:23:01/

目录


1.可被三整除的最大和

1.题目链接


2.算法原理详解

  • 思路:正难则反 + 贪心 + 分类讨论
    • 先把所有的数累加在一起,根据累加和,删除一些数
      请添加图片描述

    • 补充如何求一堆数中的最小值以及次小值?

      • sort()
      • 分类讨论 --> O ( N ) O(N) O(N)

3.代码实现

int maxSumDivThree(vector<int>& nums) 
{const int INF = 0x3f3f3f3f;int sum = 0;int x1 = INF, x2 = INF, y1 = INF, y2 = INF;for(auto& x : nums){sum += x;if(x % 3 == 1){if(x < x1){x2 = x1;x1 = x;}else if(x < x2){x2 = x;}}else if(x % 3 == 2){if(x < y1){y2 = y1;y1 = x;}else if(x < y2){y2 = x;}}}// 分类讨论if(sum % 3 == 0){return sum;}else if(sum % 3 == 1){return max(sum - x1, sum - y1 - y2);}else{return max(sum - y1, sum - x1 - x2);}
}

2.距离相等的条形码

1.题目链接


2.算法原理详解

  • 解法贪心 + 模拟
    • 每次处理一批相同的数
      • 摆放的时候,每次隔一个格子
    • 先处理出现次数最多的那个数
      • 剩下的数的处理顺序无所谓

3.代码实现

vector<int> rearrangeBarcodes(vector<int>& b) 
{unordered_map<int, int> hash;int maxVal = 0, maxCount = 0;for(auto x : b){if(maxCount < ++hash[x]){maxCount = hash[x];maxVal = x;}}int n = b.size();int index = 0;vector<int> ret(n);// 先处理出现次数最多的那个数for(int i = 0; i < maxCount; i++){ret[index] = maxVal;index += 2;}// 处理剩下的数hash.erase(maxVal);for(auto& [x, y] : hash){for(int i = 0; i < y; i++){if(index >= n){index = 1;}ret[index] = x;index += 2;}}return ret;
}

3.重构字符串

1.题目链接

  • 重构字符串

2.算法原理详解

  • 解法贪心 + 模拟
    • 前置判断maxCount > (n + 1) / 2则无解
    • 每次处理一批相同的数
      • 摆放的时候,每次隔一个格子
    • 先处理出现次数最多的那个数
      • 剩下的数的处理顺序无所谓

3.代码实现

string reorganizeString(string s) 
{int hash[26] = { 0 };char maxChar = ' ';int maxCount = 0;for(auto ch : s){if(maxCount < ++hash[ch - 'a']){maxChar = ch;maxCount = hash[ch - 'a'];}}int n = s.size();if(maxCount > (n + 1) / 2){return "";}int index = 0;string ret(n, ' ');for(int i = 0; i < maxCount; i++){ret[index] = maxChar;index += 2;}hash[maxChar - 'a'] = 0;for(int i = 0; i < 26; i++){for(int j = 0; j < hash[i]; j++){if(index >= n){index = 1;}ret[index] = 'a' + i;index += 2;}}return ret;
}

http://www.ppmy.cn/server/132495.html

相关文章

ScriptableObject基本使用

使用方法 自定义类继承ScriptableObject 可以在类内部增加数据或者数据类&#xff0c;一般用于配置 注意事项 给继承ScriptableObject的类增加CreateAssetMenu特性。 CreateAssetMenu一般默认三个参数 第一个参数是父目录 第二个参数是父目录的子选项 第三个参数是可以…

音视频入门基础:FLV专题(15)——Video Tag简介

一、引言 根据《video_file_format_spec_v10_1.pdf》第75页&#xff0c;如果某个Tag的Tag header中的TagType值为9&#xff0c;表示该Tag为Video Tag&#xff1a; 这时StreamID之后紧接着的就是VideoTagHeader&#xff0c;也就是说这时Tag header之后的就是VideoTagHeader&…

2 机器学习之基本术语

要进行机器学习&#xff0c;先要有数据。假定我们收集了一批关于西瓜的数据&#xff0c;例如&#xff08;色泽青绿&#xff1b;根蒂蜷缩&#xff1b;敲声浊响&#xff09;​&#xff0c;​&#xff08;色泽乌黑&#xff1b;根蒂稍蜷&#xff1b;敲声沉闷&#xff09;​&#xf…

uniapp的相关知识(1)

1、hover-class&#xff1a;当有鼠标按下时&#xff0c;会切换对应的样式&#xff1b;也可以设置对应的变色时间。 2、selectable&#xff1a;设置text组件的文本是否可以进行复制。 3、with&#xff1a;当设置为80%时&#xff0c;表示宽占整个屏幕的80%。 4、border&#x…

【数据结构】:破译排序算法--数字世界的秩序密码(二)

文章目录 前言一.比较排序算法1.Bubble Sort冒泡排序1.1.冒泡排序原理1.2.冒泡排序过程1.3.代码实现1.4.复杂度和稳定性 2.Quick Sort快速排序2.1递归快速排序2.1.1.递归快速排序原理2.1.2.递归快速排序过程2.1.3.代码实现 2.2.非递归快速排序2.2.1.非递归快速排序原理2.2.2.非…

Apache DolphinScheduler-1.3.9源码分析(二)

引言 随着大数据的发展&#xff0c;任务调度系统成为了数据处理和管理中至关重要的部分。Apache DolphinScheduler 是一款优秀的开源分布式工作流调度平台&#xff0c;在大数据场景中得到广泛应用。 在本文中&#xff0c;我们将对 Apache DolphinScheduler 1.3.9 版本的源码进…

凡事预则立,不预则废

在交易的竞技场上&#xff0c;每位交易员都拥有自己的一套打法&#xff0c;这些独特的交易风格不仅塑造了他们的个人特点&#xff0c;更是他们成功的关键所在。今天采访的Eagle Trader交易员刘先生&#xff0c;就给我一种很稳妥的感觉&#xff0c;那么&#xff0c;刘先生的“稳…

AWS注册时常见错误处理

引言 创建AWS账号是使用AWS云服务的第一步&#xff0c;但在注册过程中可能会遇到一些常见的问题。本文中九河云将帮助您排查和解决在创建AWS账户时可能遇到的一些常见问题&#xff0c;包括未接到验证电话、最大失败尝试次数错误以及账户激活延迟等。 常见问题及解决方法 1. …