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
}

执行结果如下:
图片


左神java代码