文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给你一个整数数组 nums​​​ 和一个整数 k 。你需要将这个数组划分到 k 个相同大小的子集中,使得同一个子集里面没有两个相同的元素。

一个子集的 不兼容性 是该子集里面最大值和最小值的差

请你返回将数组分成 k 个子集后,各子集 不兼容性最小值 ,如果无法分成分成 k 个子集,返回 -1 。

子集的定义是数组中一些数字的集合,对数字顺序没有要求。

示例 1:
输入:nums = [1,2,1,4], k = 2
输出:4
解释:最优的分配是 [1,2] 和 [1,4] 。
不兼容性和为 (2-1) + (4-1) = 4 。
注意到 [1,1] 和 [2,4] 可以得到更小的和,但是第一个集合有 2 个相同的元素,所以不可行。示例 2:
输入:nums = [6,3,8,1,3,1,2,2], k = 4
输出:6
解释:最优的子集分配为 [1,2],[2,3],[6,8] 和 [1,3] 。
不兼容性和为 (2-1) + (3-2) + (8-6) + (3-1) = 6 。示例 3:
输入:nums = [5,3,3,6,3,3], k = 3
输出:-1
解释:没办法将这些数字分配到 3 个子集且满足每个子集里没有相同数字。提示:
1 <= k <= nums.length <= 16
nums.length 能被 k 整除。
1 <= nums[i] <= nums.length

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

2. 解题

写的回溯,超时了,参考评论区的刘波同学的代码,做了剪枝,通过了

class Solution {int mindiff = INT_MAX;int size;//每个集合的大小
public:int minimumIncompatibility(vector<int>& nums, int k) {if(k == nums.size())//特殊情况return 0;unordered_map<int, int> m;sort(nums.begin(), nums.end());for(auto n : nums){if(++m[n] > k)return -1;}size = nums.size()/k;vector<int> curnum(k), count(k, 0);//每个集合当前的数,集合大小dfs(nums, curnum, count, 0, 0);return mindiff;}   void dfs(vector<int>& nums, vector<int>& curnum, vector<int>& count, int i, int diff){if(diff >= mindiff)//剪枝return;if(i == nums.size()){if(diff < mindiff)mindiff = diff;return;}for(int j = 0; j < count.size(); ++j){if(curnum[j] == nums[i])//存在相同的数字了continue;if(count[j] < size)//集合还没满{int originnum = curnum[j];//集合当前的数字curnum[j] = nums[i];//nums[i] 放入集合 jcount[j]++;//集合大小 + 1int delta = count[j] >= 2 ? (nums[i]-originnum) : 0;// diff 增量dfs(nums, curnum, count, i+1, diff+delta);count[j]--;curnum[j] = originnum;if(count[j] == 0)//参考 刘波 同学//都是空的集合,这个数字放在哪个集合都是一样的,不写这句,会超时break;}}}
};// 28 ms  7.6 MB  C++

28 ms 7.6 MB C++


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 1681. 最小不兼容性(回溯+剪枝)相关推荐

  1. LeetCode 90. 子集 II(回溯+剪枝)

    文章目录 1. 题目信息 2. 解题 2.1 循环 2.2 回溯 1. 题目信息 给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例 ...

  2. LeetCode 996. 正方形数组的数目(回溯+剪枝)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个非负整数数组 A,如果该数组每对相邻元素之和是一个完全平方数,则称这一数组为正方形数组. 返回 A 的正方形排列的数目.两个排列 A1 和 A2 ...

  3. LeetCode 491. 递增子序列(回溯+判重剪枝)

    1. 题目 给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2. 示例: 输入: [4, 6, 7, 7] 输出: [[4, 6], [4, 7], [4, 6, 7] ...

  4. LeetCode 47. 全排列 II(回溯+搜索剪枝)

    文章目录 1. 题目信息 2. 解题 1. 题目信息 给定一个可包含重复数字的序列,返回所有不重复的全排列. 示例:输入: [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1] ] ...

  5. 剑指Offer - 面试题38. 字符串的排列(全排列,排序,回溯+剪枝)

    1. 题目 输入一个字符串,打印出该字符串中字符的所有排列. 你可以以任意顺序返回这个字符串数组,但里面不能有重复元素. 示例: 输入:s = "abc" 输出:["ab ...

  6. 求解最小机器重量(回溯法/分支限界)

    求解最小机器重量(回溯法/分支限界) 回溯法:从后往前记录全局最优解(最小价值,最小重量,尽管他们不是同一个物品上的,最大程度贪心),因为采用DFS深度优先,会马上得到一个结果,然后比较当前选择的重量 ...

  7. leetcode 64. 最小路径和(递归 / 动态规划解法图解)(Java版)

    题目 leetcode 64. 最小路径和 提示: m == grid.length n == grid[i].length 1 <= m, n <= 200 0 <= grid[i ...

  8. LeetCode 1631. 最小体力消耗路径(DFS + 二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 你准备参加一场远足活动.给你一个二维 rows x columns 的地图 heights ,其中 heights[row][col] 表示格子 (row ...

  9. 回溯 剪枝 之跳马问题

    回溯 剪枝 之跳马问题 原创声明 // // Created by Chenglong Shi on 2021/11/19. // Only can use to study // Once foun ...

最新文章

  1. 4、利用zookeeper来实现client端自动感知服务器端在线情况,并且可以进行负载均衡。...
  2. 英语口语(5月31日)
  3. oracle审计的格式
  4. 小车主板哪家强?PS2手柄4路电机输出..火魔童主板了解一下?
  5. 1、HTML 初步认识
  6. SAP 730模糊查询时不可以输入连续的汉字问题解决方案
  7. oracle脚本刷错了怎么办,Oracle故障处理中常用的脚本
  8. mysql多实例(mysqld_multi方式)
  9. MySQL在大数据、高并发场景下的SQL语句优化
  10. delphi 最全日期格式_DateUtils时间单元说明
  11. Java 故障处理与性能监控工具
  12. python人脸识别防小偷_Python人脸识别
  13. bootstraptable 数字不换行_不知道这些数据录入技巧,你就凹凸了!|Excel093
  14. python图像手绘效果_python 3.6实现图像的手绘效果
  15. 用html制作ps,ps制作图片的步骤
  16. 计算机网卡接口,5.8.1 计算机网卡(1)
  17. JAVA计算机毕业设计博雅楼自习室预约系统Mybatis+系统+数据库+调试部署
  18. xampp中MySQL启动错误问题
  19. codeforces 1395C Boboniu and Bit Operations(思维)
  20. Git之cherry-pick

热门文章

  1. html颜色叠加代码,html代码大全(基础使用代码)(颜色代码完整版)
  2. win10开启oracle服务器配置,Windows环境(Win10)下安装、配置服务器类Oracle Database 11g Release 2...
  3. python中的内建函数
  4. 【python】Get与Post的区别?(面试官最想听到的答案)
  5. 使用IntelliJ IDEA碰到的问题总结
  6. 大数据集群搭建之hadoop、tomcat、jdk等工具的安装(三)
  7. int 取值范围_一定范围内的随机数
  8. 从离散值中把值相近的放在一起
  9. c++远征之多态篇——异常处理
  10. QT问题记录之warning: ‘xxx’ will be initialized after [-Wreorder]