你有 n 个工作和 m 个工人。给定三个数组: difficulty, profit 和 worker ,其中:

difficulty[i] 表示第 i 个工作的难度,profit[i] 表示第 i 个工作的收益。
    worker[i] 是第 i 个工人的能力,即该工人只能完成难度小于等于 worker[i] 的工作。

每个工人 最多 只能安排 一个 工作,但是一个工作可以 完成多次 。

举个例子,如果 3 个工人都尝试完成一份报酬为 $1 的同样工作,那么总收益为 $3 。如果一个工人不能完成任何工作,他的收益为 $0 。

返回 在把工人分配到工作岗位后,我们所能获得的最大利润 。

示例 1:

输入: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7]
输出: 100
解释: 工人被分配的工作难度是 [4,4,6,6] ,分别获得 [20,20,30,30] 的收益。

这题就是直接让我们给worker安排合适的工作并且收益达到最大。difficulty 和 profit分别代表工作难度和相应的收益。如果能把diffculty和profit放在一起并根据收益排序,我们就能根据收益一个个安排工作,直到把所有人安排完。然后得到最大收益。当然你也能根据工作难度进行排序进行计算。不过稍微麻烦点。

本题解根据收益排序,关键是用什么来存收益和工作难度,我用了两种方法,一种是利用hashmap的键值对结构然后根据key或value排序,另外一种就是创建一个类,继承Comparable接口用Arrays.sort直接排序。从最大收益开始,把对应的工作难度在工人对应工作难度数组里进行二分查找,找到大于最大收益的工作难度边界,然后求出人数。知道把所有人安排工作。

1、创建新类,用对象数组排序

class Solution {public static int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {Work work[]=new Work[difficulty.length];for(int i=0;i<difficulty.length;i++){work[i]=new Work(difficulty[i],profit[i]);}Arrays.sort(work);Arrays.sort(worker);int totalMoney=0;int pcount=0;int total=0;for(int i=work.length-1;i>=0;i--){if(work[i].difficulty>worker[worker.length-1]){totalMoney+=0;}else{if(total==worker.length) break;//所有人都有工作就直接退出int left=0,right=worker.length-1;// 60 while(left<right){int mid=((right-left)>>1)+left;if(worker[mid]>=work[i].difficulty){right=mid;}else{left=mid+1;}}pcount=worker.length-left-total;//还未安排工作且符合工作难度的人数if(pcount<=0) continue;//由于收益高的不一定就是工作难度高的所以pcount有可能是负数total+=pcount;//安排过工作的人数totalMoney+=pcount*work[i].profit;}}return totalMoney;}
}
class Work implements Comparable<Work>{int difficulty;int profit;public Work(int difficulty,int profit){this.difficulty=difficulty;this.profit=profit;}  public int compareTo(Work work){return this.profit-work.profit;}
}

2、hashmap

class Solution {public static int maxProfitAssignment(int[] difficulty, int[] profit, int[] worker) {HashMap<Integer, Integer> map=new HashMap<>();Arrays.sort(worker);for(int i=0;i<difficulty.length;i++){if(map.get(difficulty[i])!=null){if(map.get(difficulty[i])<profit[i]){map.put(difficulty[i],profit[i]);//由于有可能有重复的工作难度利用hashmap的不重复性只存最大收益的}}else{map.put(difficulty[i],profit[i]);}}List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());//把map里的键值对转为entry对象 Collections.sort(list, new Comparator<Map.Entry<Integer, Integer>>() {//然后实现Compartor实现排序@Overridepublic int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {return o1.getKey()-o2.getKey();}});int maxProfit=0;int totalSalary=0;int oldMaxProfit=0;for(Map.Entry<Integer, Integer> i:list){int left=0,right=worker.length-1;if(i.getKey()>worker[worker.length-1]) break;if(maxProfit<map.get(i.getKey())){oldMaxProfit=maxProfit;maxProfit=i.getValue();while(left<right){int mid=(left+right)>>1;if(worker[mid]>=i.getKey()){right=mid;}else{left=mid+1;}}totalSalary-=oldMaxProfit*(worker.length-right);totalSalary+=maxProfit*(worker.length-right);}}return totalSalary;}
}

LeetCode刷题之826. 安排工作以达到最大收益相关推荐

  1. Java实现 LeetCode 826 安排工作以达到最大收益(暴力DP)

    826. 安排工作以达到最大收益 有一些工作:difficulty[i] 表示第i个工作的难度,profit[i]表示第i个工作的收益. 现在我们有一些工人.worker[i]是第i个工人的能力,即该 ...

  2. LeetCode 826. 安排工作以达到最大收益(map)

    1. 题目 有一些工作:difficulty[i] 表示第i个工作的难度,profit[i]表示第i个工作的收益. 现在我们有一些工人.worker[i]是第i个工人的能力,即该工人只能完成难度小于等 ...

  3. C#LeetCode刷题-双指针

    双指针篇 # 题名 刷题 通过率 难度 3 无重复字符的最长子串 24.5% 中等 11 盛最多水的容器 43.5% 中等 15 三数之和 16.1% 中等 16 最接近的三数之和 34.6% 中等 ...

  4. LeetCode刷题专栏第一篇--思维导图时间安排

    昨天是元宵节,过完元宵节相当于这个年正式过完了.不知道大家有没有投入继续投入紧张的学习工作中.年前我想开一个Leetcode刷题专栏,于是发了一个投票想了解大家的需求征集意见.投票于2019年2月1日 ...

  5. 【LeetCode刷题日记】常用算法基础和理解及运用

    在我们LeetCode刷题过程中,如果我们只是了解数据结构(数组,链表,数)的使用方法,那我们在面对复杂的题目时,是很难很好的解决问题的,因此我们要了解一些常用算法来帮助我们更好的解题. 递归和迭代 ...

  6. 【组队学习】【31期】LeetCode 刷题

    LeetCode 刷题 航路开辟者:杨世超 领航员:刘军 航海士:杨世超.李彦鹏.叶志雄.赵子一 基本信息 开源内容:https://github.com/itcharge/LeetCode-Py 开 ...

  7. LeetCode刷题指南

    CSDN话题挑战赛第1期 活动详情地址:https://marketing.csdn.net/p/bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题:Leetcode刷题指南 ...

  8. leetcode刷题方法

    leetcode刷题方法 一.范围内的200题 二.刷题步骤 三.算法思路 四.更新 1.12日留 此文章借鉴 陈同学在搬砖 微信公众号的一篇文章: https://mp.weixin.qq.com/ ...

  9. GitHub疯传,这个Leetcode刷题手册到底有多流弊?

    写在前面 最近一个读者和我反馈,他坚持刷题2个月,终于去了他梦寐以求的大厂,薪资涨幅非常可观,期间面字节跳动还遇到了原题...并表示目前国内的大厂和一些独角兽,已经越来越效仿硅谷公司的做法,通过面试给 ...

最新文章

  1. NSUserDefaults删除整个plist文件
  2. phpcms忘记管理员密码和访问错误等常见问题
  3. vs2019c语言头文件的路径,vs2019设置及第三方库的使用,
  4. Apollo进阶课程㉑丨Apollo规划技术详解——Basic Motion Planning and Overview
  5. SAP License:SAP资产相关内容
  6. iview兼容ie8_iview在ie9及以上的兼容问题解决方案__Vue.js__JavaScript__前端__iView
  7. 炫酷的sublimeText开发工具 快捷键总结
  8. 深圳端午节骑行活动,欢迎大家参加
  9. matlab交流电路仿真,单相交流调压电路Matlab仿真
  10. 论文阅读SG-PBFT: a Secure and Highly Efficient Blockchain PBFT Consensus Algorithm for IoV
  11. Ubuntu图形界面和终端界面切换快捷键
  12. 电子邮件服务器限制匿名,匿名(垃圾)邮件的根源—网络上几乎所有服务器都不可避免的“漏洞”...
  13. 如何高效设计游戏——游戏策划的自我修养与心得
  14. 深入探讨PageRank(四):PageRank的危机及搜索引擎的未来
  15. jmeter beanshell关于小数参数定义转化
  16. Canal的安装与使用(直接食用)--监控数据库binlog日志 实现实时操作
  17. 服务器群发消息,群发消息怎么发
  18. 怎么开发一个完整的对外接口API
  19. Revit二次开发:修改视图范围
  20. 【H5】h5文件之——深度学习训练样本制作

热门文章

  1. 小红书如何推广 方法总结
  2. python中——可迭代对象
  3. 浅析/etc/hosts和/etc/resolv.conf的作用
  4. 【技术向】rainmeter的设计与发现
  5. 三星R458笔记本使用ghost版后,无法调节亮度
  6. 百度相册上传下载工具
  7. java web面试题
  8. python数据分布_Python matplotlib 数据分布
  9. 惊掉下巴!天津学手绘插画培训让你踏进高薪行列
  10. html表格设计(分列,设置边框)