算法题解----leetcode.826.安排工作以达到最大收益
2021/8/26 1:06:03
本文主要是介绍算法题解----leetcode.826.安排工作以达到最大收益,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
先来吐槽一件事,今天我在配置tomcat的时候环境变量整了半天才弄好,然后又要整合idea和javaweb,
最坑爹的来了,我之前用的是idea社区版本,没有javaee,我也不会配置,就很烦,我又没钱买旗舰版,
然后下了个edu版,还是不太行,总之忙活了一两个小时还没搞好,心态小炸,
原本我还在为我终于看不到html css javascript那些我一看到就想吐的东西而窃喜(没有其他的意思,就是我是真的不喜欢学前端,看到<>标签莫名想吐hh)。
言归正传,我们来看看今天的题解.
题目描述:
有一些工作:difficulty[i] 表示第 i 个工作的难度,profit[i] 表示第 i 个工作的收益。 现在我们有一些工人。worker[i] 是第 i 个工人的能力,即该工人只能完成难度小于等于 worker[i] 的工作。 每一个工人都最多只能安排一个工作,但是一个工作可以完成多次。 举个例子,如果 3 个工人都尝试完成一份报酬为 1 的同样工作,那么总收益为 $3。如果一个工人不能完成任何工作,他的收益为 $0 。 我们能得到的最大收益是多少?
示例:
输入: 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] 的收益。
提示:
1 <= difficulty.length = profit.length <= 10000 1 <= worker.length <= 10000 difficulty[i], profit[i], worker[i] 的范围是 [1, 10^5]
这题我的思路是这样的:
开一个map,key存的是困难度,value存的是相应困难度的最大收益,这里因为它有可能两件工作困难度相同但是收益不同,我们肯定取最大值。
然后把工人的能力排个序,声明一个迭代器指向建好的map的begin()位置,遍历排过序的工人数组,这时候要用一个小技巧,设置一个mx存储
map里面困难度小于等于工人能力值的工作的最大收益,这样它的时间复杂度只有O(n+m),再加上之前我们排序的时间复杂度,这题的时间复杂度就是O(nlogn)
范围是10^5,完全可以过,看看代码~
class Solution { public: int maxProfitAssignment(vector<int>& difficulty, vector<int>& profit, vector<int>& worker) { map<int,int> m; for(int i=0;i<difficulty.size();i++) { if(m.find(difficulty[i]) == m.end()) m.insert(make_pair(difficulty[i],profit[i])); else if(m.find(difficulty[i])->second<profit[i]) m.find(difficulty[i])->second = profit[i]; } sort(worker.begin(),worker.end()); int res = 0; int mx = 0; map<int,int>::iterator iter = m.begin(); for(int i=0;i<worker.size();i++) { while(iter!=m.end() && worker[i]>=(*iter).first) { mx = max(mx,(*iter).second); iter++; } res += mx; } return res; } };
这篇关于算法题解----leetcode.826.安排工作以达到最大收益的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享