2021-05-09:给定数组hard和money,长度都为N;hard[i]表示i号的难度, money[i]表示i号工作的收入;给定数组ability,长度都为M,ability[j]表示j号人的能力;每一号工作,都可以提供无数的岗位,难度和收入都一样;但是人的能力必须>=这份工作的难度,才能上班。返回一个长度为M的数组ans,ans[j]表示j号人能获得的最好收入。
福大大 答案2021-05-10:
按难度从小到大排序,按收入从大到小排序。
代码用golang编写。代码如下:
package main import ( "fmt" "sort" ) func main() { job := []*Job{&Job{6, 7}, &Job{3, 4}, &Job{10, 13}, &Job{1000000, 2}, &Job{3, 9}} ability := []int{5, 3, 9, 10, 4, 1, 13} ret := getMoneys(job, ability) fmt.Println(ret) } type Job struct { Money int Hard int } func getMoneys(job []*Job, ability []int) []int { sort.Slice(job, func(i, j int) bool { a, b := job[i], job[j] if a.Hard != b.Hard { return a.Hard < b.Hard } else { return b.Money < a.Money } }) // key : 难度 value:报酬 map0 := make(map[int]int) //有序表 map0[job[0].Hard] = job[0].Money // pre : 上一份进入map的工作 pre := job[0] for i := 1; i < len(job); i++ { if job[i].Hard != pre.Hard && job[i].Money > pre.Money { pre = job[i] map0[pre.Hard] = pre.Money } } ans := make([]int, len(ability)) map0slice := make([]int, 0) for key, _ := range map0 { map0slice = append(map0slice, key) } sort.Ints(map0slice) for i := 0; i < len(ability); i++ { // ability[i] 当前人的能力 <= ability[i] 且离它最近的 key := -1 for j := len(map0slice) - 1; j >= 0; j-- { if map0slice[j] <= ability[i] { key = map0slice[j] break } } if key != -1 { ans[i] = map0[key] } } return ans }
执行结果如下: