[Swift]LeetCode826. 安排工作以達到最大收益 | Most Profit Assigning Work

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
?微信公眾號:山青詠芝(shanqingyongzhi)
?博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/)
?GitHub地址:https://github.com/strengthen/LeetCode
?原文地址:?https://www.cnblogs.com/strengthen/p/10569392.html?
?如果鏈接不是山青詠芝的博客園地址,則可能是爬取作者的文章。
?原文已修改更新!強烈建議點擊原文地址閱讀!支持作者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

We have jobs:?difficulty[i]?is the difficulty of the?ith job, and?profit[i]?is the profit of the?ith job.?

Now we have some workers.?worker[i]?is the ability of the?ith worker, which means that this worker can only complete a job with difficulty at most?worker[i].?

Every worker can be assigned at most one job, but one job?can be completed multiple times.

For example, if 3 people attempt the same job that pays $1, then the total profit will be $3.? If a worker cannot complete any job, his profit is $0.

What is the most profit we can make?

Example 1:

Input: difficulty = [2,4,6,8,10], profit = [10,20,30,40,50], worker = [4,5,6,7]
Output: 100 
Explanation: Workers are assigned jobs of difficulty [4,4,6,6] and they get profit of [20,20,30,30] seperately.

Notes:

  • 1 <= difficulty.length = profit.length <= 10000
  • 1 <= worker.length <= 10000
  • difficulty[i], profit[i], worker[i]? are in range?[1, 10^5]

有一些工作: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]

580ms

 1 class Solution {
 2     func maxProfitAssignment(_ difficulty: [Int], _ profit: [Int], _ worker: [Int]) -> Int {
 3         var tasks = [(Int, Int)]()
 4         for i in 0..<difficulty.count {
 5             tasks.append((profit[i], difficulty[i]))
 6         }
 7         tasks = tasks.sorted {$0.0 > $1.0}
 8         var workers = worker.sorted {$0 > $1}
 9         var t = 0, w = 0
10         var res = 0
11         while (w < worker.count && t < tasks.count) {
12             if tasks[t].1 <= workers[w] {
13                 res += tasks[t].0
14                 w += 1
15             } else {
16                 t += 1
17             }
18         }
19         return res
20     }
21 }

588ms

 1 class Solution {    
 2     func maxProfitAssignment(_ difficulty: [Int], _ profit: [Int], _ worker: [Int]) -> Int {
 3         let dp = zip(difficulty, profit).sorted(by: {$0.0 < $1.0})
 4         
 5         var p = 0
 6         var i = 0, maxp = 0
 7         for w in worker.sorted(by: <) {
 8             while i < dp.count && w >= dp[i].0 {
 9                 maxp = max(maxp, dp[i].1)
10                 i += 1
11             }
12             p += maxp
13         }        
14         return p
15     }
16 }

616ms

 1 class Solution {
 2     func maxProfitAssignment(_ difficulty: [Int], _ profit: [Int], _ worker: [Int]) -> Int {
 3         var dp = [Int : Int]()
 4         for i in 0..<difficulty.count {
 5             let d = difficulty[i]
 6             let p = profit[i]
 7             if dp[d, default: 0] < p {
 8                 dp[d] = p
 9             }
10         }
11         let keys = dp.keys.sorted()
12         var maxSoFar = 0
13         var sanitizedD = [Int]()
14         var sanitizedP = [Int]()
15         for i in 0..<keys.count {
16             let key = keys[i]
17             if dp[key]! > maxSoFar {
18                 maxSoFar = dp[key]!
19                 sanitizedD.append(key)
20                 sanitizedP.append(dp[key]!)
21             }
22         }
23 
24         var result = 0
25         for i in 0..<worker.count {
26             let w = worker[i]
27             result += maxFittingProfit(forWorker: w, inDifficulties: sanitizedD, withProfits:sanitizedP)
28         }
29         
30         return result
31     }
32     
33     func maxFittingProfit(forWorker worker: Int, inDifficulties difficulties: [Int], withProfits profits: [Int]) -> Int
34     {
35         var lower = 0, upper = difficulties.count - 1
36         var i = profits.count / 2
37         while (lower <= upper) {
38             if difficulties[i] > worker {
39                 upper = i - 1
40                 i = (lower + upper) / 2
41             }
42             else if (i != difficulties.count - 1) && (difficulties[i+1] <= worker) {
43                 lower = i + 1
44                 i = (lower + upper) / 2
45             }
46             else {
47                 return profits[i]
48             }
49         }
50         return 0
51     }
52 }

620ms

 1 class Solution {
 2     func binarySearch(_ difficulty: inout [Int], _ worker: Int) -> Int? {
 3         if difficulty.count == 0 || difficulty[0] > worker {
 4             return nil
 5         }
 6         
 7         var left = 0, right = difficulty.count - 1
 8         while left < right {
 9             let mid = left + (right - left) / 2
10             if worker >= difficulty[mid] &&
11                 worker < difficulty[mid + 1] {
12                 return mid
13             }
14             
15             if worker > difficulty[mid] {
16                 left = mid + 1
17             } else {
18                 right = mid
19             }
20         }
21         
22         return left
23     }
24     
25     func maxProfitAssignment(_ difficulty: [Int], _ profit: [Int], _ worker: [Int]) -> Int {
26         var p = 0
27         
28         let ed = difficulty.enumerated().sorted(by: { $0.element < $1.element })
29         var dp = [Int: Int]()
30         var maxp = 0
31         for (index, d) in ed {
32             maxp = max(maxp, profit[index])
33             dp[d] = maxp
34         }
35 
36         var d = difficulty.sorted()
37         for w in worker {
38             let di = binarySearch(&d, w)
39             if let di = di {
40                 p += dp[d[di]]!
41             }
42         }        
43         return p
44     }
45 }

628ms

 1 class Solution {
 2     func maxProfitAssignment(_ difficulty: [Int], _ profit: [Int], _ worker: [Int]) -> Int {
 3         var jobs = [Int: Int]() // [Difficulty, Profit]
 4         for i in 0..<difficulty.count {
 5             let d = difficulty[i]
 6             if let existing = jobs[d] {
 7                 jobs[d] = max(existing, profit[i])
 8             } else {
 9                 jobs[d] = profit[i]
10             }
11         }
12         let sorted = jobs.sorted { (a, b) -> Bool in
13             if a.value == b.value {
14                 return a.key > b.key
15             } else {
16                 return a.value > b.value
17             }
18         }
19         var current = 0        
20         let worker = worker.sorted().reversed()        
21         var maxProfit = 0
22         
23         for w in worker {
24             while current < sorted.count, sorted[current].key > w {
25                 current += 1
26             }
27             
28             if current == sorted.count {
29                 return maxProfit
30             } else {
31                 maxProfit += sorted[current].value
32             }
33         }        
34         return maxProfit
35     }
36 }

Runtime:?668 ms
Memory Usage:?20.1 MB
 1 class Solution {
 2     func maxProfitAssignment(_ difficulty: [Int], _ profit: [Int], _ worker: [Int]) -> Int {
 3         var res:Int = 0
 4         var n:Int = profit.count
 5         var dp:[Int] = [Int](repeating:0,count:100001)
 6         for i in 0..<n
 7         {
 8             dp[difficulty[i]] = max(dp[difficulty[i]], profit[i])
 9         }
10         for i in 1..<dp.count
11         {
12             dp[i] = max(dp[i], dp[i - 1])
13         }
14         for ability in worker
15         {
16             res += dp[ability]
17         }
18         return res
19     }
20 }

772ms

 1 class Solution {
 2     func maxProfitAssignment(_ difficulty: [Int], _ profit: [Int], _ worker: [Int]) -> Int {
 3         var max = 0 as Int        
 4         let count = difficulty.count
 5 
 6         var sortedCache = [[Int]:Int]()
 7         for i in 0...count-1{
 8             sortedCache[[difficulty[i],i]] = profit[i]
 9         }
10         
11         var difficulty_ = sortedCache.keys.sorted{
12             return $0[0] < $1[0]
13         }
14         
15         var maxProfitCache = [Int:Int]()
16         var sortedMPKeys = [Int]()        
17         var runningMaxProfit = 0
18         
19         for i in 0...count-1{
20             
21             let nextK = difficulty_[i]
22             let dif = nextK[0]
23             var profit = sortedCache[nextK] as! Int
24         
25             var nextMax = maxProfitCache[dif] ?? 0
26             let nextMax_ = nextMax
27             
28             if runningMaxProfit > profit{
29                 profit = runningMaxProfit    
30             }
31             
32             if profit > nextMax{
33                 
34                 runningMaxProfit = profit
35                 nextMax = profit
36                 maxProfitCache[dif] = nextMax
37                 
38                 if nextMax_ == 0{
39                     sortedMPKeys.append(dif)
40                 }
41             }                
42         }
43         
44         sortedMPKeys = sortedMPKeys.sorted()
45         
46         for w in worker{
47             var maxW = 0 as Int
48             let index = binarySearch(sortedMPKeys, key: w, range: 0 ..< sortedMPKeys.count)
49             if index != nil && index! >= 0{
50                 maxW = maxProfitCache[sortedMPKeys[index!]]!
51             }else if index == nil && index != -1{
52                 maxW = maxProfitCache[sortedMPKeys.last!]!
53             }
54 
55             max += maxW
56         }
57         return max
58     }
59 }
60 
61 func binarySearch<T: Comparable>(_ a: [T], key: T, range: Range<Int>) -> Int? {
62     return _binarySearch(a, key: key, range: range, -1)
63 }
64 
65 func _binarySearch<T: Comparable>(_ a: [T], key: T, range: Range<Int>, _ maxIdxResult : Int) -> Int? {
66     
67     var maxIdxResult = maxIdxResult
68     
69     if range.lowerBound >= range.upperBound {
70         return maxIdxResult
71 
72     } else {
73         let midIndex = range.lowerBound + (range.upperBound - range.lowerBound) / 2
74         if a[midIndex] > key {
75             return _binarySearch(a, key: key, range: range.lowerBound ..< midIndex,maxIdxResult)
76         } else if a[midIndex] < key {
77             maxIdxResult = midIndex
78             return _binarySearch(a, key: key, range: midIndex + 1 ..< range.upperBound,maxIdxResult)
79         } else {
80             return midIndex
81         }
82     }
83 }
84 
85 func println(_ format : String, _ args : CVarArg...) {
86     let s = String.init(format: format, arguments: args)
87     print(s, separator: "", terminator: "\n")
88 }

?

?

轉載于:https://www.cnblogs.com/strengthen/p/10569392.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/248313.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/248313.shtml
英文地址,請注明出處:http://en.pswp.cn/news/248313.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

H5第四天(1)

boostrap框架介紹 核心知識點 boostrap框架柵格系統[重點,不是難點]基本的全局樣式 學習目標 能夠使用boostrap框架中的基本樣式能夠使用柵格系統完成阿里百秀案例 boostrap框架 介紹 https://www.bootcss.com/ Bootstrap 是最受歡迎的 HTML、CSS 和 JS 框架&#xff0c;用…

javascript基礎入門知識點整理

學習目標:- 掌握編程的基本思維- 掌握編程的基本語法 typora-copy-images-to: mediaJavaScript基礎 HTML和CSS 京東 課前娛樂 眾人皆笑我瘋癲,我笑爾等看不穿 課前說明 目標&#xff1a;掌握編程的基本思想掌握JavaScript的基礎語法,使用常見API(備注)完成相應案例及練習和作業…

學習筆記-canny邊緣檢測

Canny邊緣檢測 聲明&#xff1a;閱讀本文需要了解線性代數里面的點乘&#xff08;圖像卷積的原理&#xff09;&#xff0c;高等數學里的二元函數的梯度&#xff0c;極大值定義&#xff0c;了解概率論里的二維高斯分布 1.canny邊緣檢測原理和簡介 2.實現步驟 3.總結 一、 Canny邊…

H5第四天(2)

Bootstrap框架 Bootstrap框架 為什么要學Bootstrap框架 Bootstrap框架: 為我們提供了用來實現響應式開發的公共資源 總結: Bootstrap框架用來實現響應式布局Bootstrap框架中重點學什么 Bootstrap框架提供了很多豐富的網頁開發資源,代碼有上萬行代碼.1. 重點學習框架中提供的基…

javascript高級實戰學習

學習目標:- 理解面向對象開發思想- 掌握 JavaScript 面向對象開發相關模式- 掌握在 JavaScript 中使用正則表達式- typora-copy-images-to mediaJavaScript 高級 課程介紹 課程大綱 在線地址&#xff1a;JavaScript 高級 目標 理解面向對象開發思想 掌握 JavaScript 面向對象…

H5C3筆記微整合

傳統布局&#xff08;寬度百分比設置&#xff09; 伸縮布局&#xff08;flex&#xff09; 自適應布局&#xff08;lessrem媒體查詢&#xff09; 1、less的使用 2、rem的使用 我的理解&#xff1a; 1、假如想把ui 給的圖片設置在網頁上&#xff0c;給網頁設置個份額值為 x 2、…

如何開發出優秀的APICloud應用

APICloud定制平臺項目實施規范APICloud應用優化策略Top30如何開發出運行體驗良好、高性能的App如何開發出客戶滿意、能夠順利交付的App1. 引擎或模塊問題&#xff1a; 遇到應用層無法解決的問題&#xff0c;如果能確定需要引擎和模塊支持的&#xff0c;不要自己想辦法繞過去&am…

收破爛怎么入行

收破爛分為幾個環節。1、回收&#xff08;回收利用、消息傳遞&#xff0c;消息處理&#xff09;2、集中處理&#xff08;垃圾分類&#xff0c;垃圾測試&#xff0c;垃圾投入使用&#xff0c;成品&#xff09;3、應用&#xff08;垃圾回收再應用&#xff0c;提供給需要資源的單位…

javaScript第一天(2)

javaScript基礎 1. javaScript的由來【了解】 為什么會出現js 早期出現js的原因就是為了解決一個問題: 用戶和瀏覽器(網頁)進行交互其他了解: 系統程序員Brendan Eich 設計了js語言, js語言1借鑒C語言的基本語法; (2)借鑒Java語言的數據類型和內存管理; (3)借鑒Scheme語言&…

WC2018 通道

好久以前開的坑&#xff0e; 到今天才填上&#xff0e; 首先考慮隊第一顆樹邊分&#xff0c;然后分成兩個集合\(L,R\)&#xff0c;在第二棵樹上建出虛樹&#xff0c;在每個路徑\(lca\)處統計答案&#xff0c;維護點集的直徑只有正權很好維護&#xff0e; #include <bits/std…

javaScript第一天(1)

01-JavaScript基礎 核心知識點 javaScript書寫位置javaScript變量javaScript數據類型javaScript數據類型轉換javaScript運算符 今日學習目標 能夠定義一個變量并完成變量的賦值能夠說出每一種具體的數據類型能夠數據類型之間的相互轉化能夠掌握各種運算符的作用 序言 Java…

javaScript第二天(1)

02-JavaScript基礎 1.核心知識點 運算符分支語句 【重點】斷點調試 [查看程序邏輯的一個技能] 2.今日學習目標 能夠掌握js中相關的運算符 能夠掌握理解算數運算符使用及特點能夠掌握賦值運算符的使用及特點能夠掌握一元運算符的使用及特點能夠掌握比較運算符的特點,理解等于…

第四周總結

第四周作業 這次作業屬于哪個課程C語言程序設計這個作業要求在哪里第四周作業我的課程目標全部學會這個作業在那個具體方面幫助我實現目標深入了解二維數組參考文獻教科書一&#xff0c;基礎作業 程序填空題5-1 輸入一個正整數 n (1≤n≤10)和n 階方陣a的元素&#xff0c;如果方…

2019春季學期第四周作業

2019春季學期第四周作業 這個作業屬于那個課程C語言程序設計Ⅰ這次作業要求在哪里2019春季學期第四周作業我在這個課程的目標是我希望能夠更加掌握循環和排序參考文獻無選擇法排序 本題要求將給定的n個整數從大到小排序后輸出。輸入格式&#xff1a; 輸入第一行給出一個不超過1…

javaScript第二天(2)

02JavaScript基礎隨堂筆記 01.運算符[☆] 知識點-算數運算符 作用就是進行 加, 減, 乘, 除 , 取余運算的 算數運算符的重點是通過算數運算和可以實現類型轉換 加號可以實現數據類型轉換: 一個數字和一個空字串相加最后的結果就是字符串減號也可以實現數據類型轉換乘法符號也可…

MFC中的基本知識

轉載于:https://www.cnblogs.com/o8le/archive/2012/05/21/2512178.html

Python中字符串操作函數string.split('str1')和string.join(ls)

Python中的字符串操作函數split 和 join能夠實現字符串和列表之間的簡單轉換&#xff0c; 使用 .split()可以將字符串中特定部分以多個字符的形式&#xff0c;存儲成列表 1 def split(self, *args, **kwargs): # real signature unknown2 """3 …

javaScript第三天(1)

03-JavaScript基礎 1.核心知識點 分支語句 【重點】斷點調試 [查看程序邏輯的一個技能]循環語句[重點 ☆☆☆] 2.今日學習目標 能夠掌握條件判斷分支語句能夠掌握switch分支語句能夠掌握三元表達式分支語句能夠掌握循環語句 條件判斷&#xff08;分支&#xff09; 語法 //…

關于單鏈表的頭插法和尾插法

#include<stdio.h>#include<stdlib.h> typedef struct Node { // 定義的鏈表類型 int data; struct Node *next; }LNode , *Linklist; void print(Linklist L){ //這是一個將鏈表數據輸出的函數 Linklist temL; whi…

javascript第三天(2)

03JavaScript基礎課堂筆記 01-分支語句 知識點-多條件判斷分支語句 語法 if(條件) {代碼1 }else if(條件) {代碼2 }else if(條件) {代碼3 }else {代碼4 }執行過程 1. 代碼自上而下執行 2. 程序先判斷第一個條件是否成立 true 還是 false 3. 如何第一個條件的結果是 true,那么就…