考点:贪心+有序表TreeMap(优化查询)


🐌1. 题目描述

:::info 给定数组hardmoney,长度都为N,hard[i]表示i号工作的难度,money[i]表示i号工作的收入。
给定数组ability,长度都为M,ability[j]表示j号人的能力,每一号工作,都可以提供无数的岗位,难度和收入都一样。但是人的能力必须>=这份工作的难度,才能上班。
返回一个长度为M的数组ansans[j]表示j号人能获得的最好收入。 :::


💡2. 解决思路

贪心:难度相同的工作选择收入高的,收入相同时选择难度较低的工作
因此对数组处理之后剩余hardmoney数组应该是工作难度和对应的收入应该是同步递增的关系。


🚩3. 代码实现

  1. package class02;
  2. import java.util.Arrays;
  3. import java.util.Comparator;
  4. import java.util.TreeMap;
  5. public class Code01_ChooseWork {
  6. public static class Job {
  7. public int money;
  8. public int hard;
  9. public Job(int m, int h) {
  10. money = m;
  11. hard = h;
  12. }
  13. }
  14. // 定义排序规则:按照工作难度排序,难度相同的工作选择收入高的
  15. public static class JobComparator implements Comparator<Job> {
  16. @Override
  17. public int compare(Job o1, Job o2) {
  18. return o1.hard != o2.hard ? (o1.hard - o2.hard) : (o2.money - o1.money);
  19. }
  20. }
  21. public static int[] getMoneys(Job[] job, int[] ability) {
  22. // 对原始数组进行排序
  23. Arrays.sort(job, new JobComparator());
  24. // key : 难度 value:报酬
  25. TreeMap<Integer, Integer> map = new TreeMap<>();
  26. // 第一组数据
  27. map.put(job[0].hard, job[0].money);
  28. // pre : 上一份进入map的工作
  29. Job pre = job[0];
  30. // 对数组数据进行预处理,处理之后保证工作难度和对应的收入应该是同步递增的关系
  31. for (int i = 1; i < job.length; i++) {
  32. if (job[i].hard != pre.hard && job[i].money > pre.money) {
  33. pre = job[i];
  34. map.put(pre.hard, pre.money);
  35. }
  36. }
  37. int[] ans = new int[ability.length];
  38. for (int i = 0; i < ability.length; i++) {
  39. // ability[i] 当前人的能力 <= ability[i] 且离它最近的
  40. Integer key = map.floorKey(ability[i]);
  41. ans[i] = key != null ? map.get(key) : 0;
  42. }
  43. return ans;
  44. }
  45. }