算法奇妙屋(四十四)-贪心算法学习之路11
文章目录一. 力扣 [1262. 可被三整除的最大和](https://leetcode.cn/problems/greatest-sum-divisible-by-three/description/)1. 题目解析2. 算法原理3. 代码二. 力扣 [1054. 距离相等的条形码](https://leetcode.cn/problems/distant-barcodes/description/)1. 题目解析2. 算法原理3. 代码三. 力扣 [767. 重构字符串](http://leetcode.cn/problems/reorganize-string/description/)1. 题目解析2. 算法原理3. 代码一. 力扣1262. 可被三整除的最大和1. 题目解析2. 算法原理主要思想是正难则反, 先求总和sum, 再根据情况讨论, 本题有贪心和动态规划两种解法, 这里只给出贪心3. 代码classSolution{publicintmaxSumDivThree(int[]nums){intsum0;for(intx:nums){sumx;}if(sum%30){returnsum;}elseif(sum%31){intmin10x3f3f3f3f,min20x3f3f3f3f,min0x3f3f3f3f;for(intx:nums){if(x%31xmin){minx;}if(x%32){if(xmin1){min2min1;min1x;}elseif(min1xxmin2){min2x;}}}returnMath.max(sum-min,sum-min1-min2);}else{intmin10x3f3f3f3f,min20x3f3f3f3f,min0x3f3f3f3f;for(intx:nums){if(x%32xmin){minx;}if(x%31){if(xmin1){min2min1;min1x;}elseif(min1xxmin2){min2x;}}}returnMath.max(sum-min,sum-min1-min2);}}}二. 力扣1054. 距离相等的条形码1. 题目解析有多个相同元素的数组, 重新排列使其相邻元素不相同2. 算法原理这道题的算法原理很简单, 模拟一遍, 间隔填写3. 代码classSolution{MapInteger,Integerhash;publicint[]rearrangeBarcodes(int[]barcodes){hashnewHashMap();intval0,count0;intnbarcodes.length;// 把元素与个数丢入哈希表, 同时找出最多的相同元素for(intx:barcodes){hash.put(x,hash.getOrDefault(x,0)1);if(counthash.get(x)){counthash.get(x);valx;}}int[]retnewint[n];// 图中第一个位置对应的就是0号位置intindex0;for(inti0;icount;i){ret[index]val;index2;}// 删除valhash.remove(val);// 添加其他元素, 遍历key, 再在内循环遍历出现的次数for(intx:hash.keySet()){for(inti0;ihash.get(x);i){// 当index大于数组长度时, 说明偶数位置(图中的奇数位置)已经遍历完, 这里将index从1开始, 因为元素个数和ret长度一致, 因此仅会修改一次if(indexn-1)index1;ret[index]x;index2;}}returnret;}}三. 力扣767. 重构字符串1. 题目解析和上道题很相似, 这里无非换成了字符, 同时要注意, 可能存在无法排列的情况2. 算法原理当单一字符的个数超过了(n 1) / 2时, 无论怎么排序都无法满足题目要求3. 代码classSolution{publicStringreorganizeString(Strings){char[]cs.toCharArray();intnc.length;// 因为这里全是小写字符, 用数组代替哈希表int[]hashnewint[26];charval0;intcount0;for(charch:c){hash[ch-a];if(counthash[ch-a]){valch;counthash[ch-a];}}if(count(n1)/2)return;char[]retnewchar[n];intindex0;for(inti0;icount;i){ret[index]val;index2;}hash[val-a]0;for(inti0;i26;i){for(intj0;jhash[i];j){if(indexn-1)index1;ret[index](char)(ia);index2;}}returnnewString(ret);}}