zoukankan      html  css  js  c++  java
  • [Swift]LeetCode1090. 受标签影响的最大值 | Largest Values From Labels

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/11014404.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    We have a set of items: the i-th item has value values[i] and label labels[i].

    Then, we choose a subset S of these items, such that:

    • |S| <= num_wanted
    • For every label L, the number of items in S with label L is <= use_limit.

    Return the largest possible sum of the subset S

    Example 1:

    Input: values = [5,4,3,2,1], labels = [1,1,2,2,3], num_wanted = 3, use_limit = 1
    Output: 9
    Explanation: The subset chosen is the first, third, and fifth item.
    

    Example 2:

    Input: values = [5,4,3,2,1], labels = [1,3,3,3,2], num_wanted = 3, use_limit = 2
    Output: 12
    Explanation: The subset chosen is the first, second, and third item.
    

    Example 3:

    Input: values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 1
    Output: 16
    Explanation: The subset chosen is the first and fourth item.
    

    Example 4:

    Input: values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 2
    Output: 24
    Explanation: The subset chosen is the first, second, and fourth item. 

    Note:

    1. 1 <= values.length == labels.length <= 20000
    2. 0 <= values[i], labels[i] <= 20000
    3. 1 <= num_wanted, use_limit <= values.length

    我们有一个项的集合,其中第 i 项的值为 values[i],标签为 labels[i]

    我们从这些项中选出一个子集 S,这样一来:

    • |S| <= num_wanted
    • 对于任意的标签 L,子集 S 中标签为 L 的项的数目总满足 <= use_limit

    返回子集 S 的最大可能的 和。 

    示例 1:

    输入:values = [5,4,3,2,1], labels = [1,1,2,2,3], num_wanted = 3, use_limit = 1
    输出:9
    解释:选出的子集是第一项,第三项和第五项。
    

    示例 2:

    输入:values = [5,4,3,2,1], labels = [1,3,3,3,2], num_wanted = 3, use_limit = 2
    输出:12
    解释:选出的子集是第一项,第二项和第三项。
    

    示例 3:

    输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 1
    输出:16
    解释:选出的子集是第一项和第四项。
    

    示例 4:

    输入:values = [9,8,8,7,6], labels = [0,0,0,1,1], num_wanted = 3, use_limit = 2
    输出:24
    解释:选出的子集是第一项,第二项和第四项。 

    提示:

    1. 1 <= values.length == labels.length <= 20000
    2. 0 <= values[i], labels[i] <= 20000
    3. 1 <= num_wanted, use_limit <= values.length

    188ms
     1 class Solution
     2 {
     3     struct LabelMap
     4     {
     5         let val: Int
     6         let label: Int
     7     }
     8     
     9     func largestValsFromLabels(_ values: [Int], _ labels: [Int], _ num_wanted: Int, _ use_limit: Int) -> Int
    10     {
    11         var data:[LabelMap] = []
    12         var usedLabel: [Int: Int] = [:]
    13         
    14         // form data list
    15         for i in 0..<values.count
    16         {
    17             let label = labels[i]
    18             data.append(LabelMap(val: values[i], label: label))
    19             
    20             if let _ = usedLabel[label] {
    21                 // do nothing
    22             } else {
    23                 usedLabel[label] = use_limit
    24             }
    25         }
    26         
    27         // sort by value
    28         data.sort(by: { (a, b) in
    29             return a.val > b.val
    30         })
    31         
    32         // iterate
    33         var sum = 0
    34         var count = 0
    35         for i in 0..<data.count
    36         {
    37             let d = data[i]
    38             
    39             let remindCount = usedLabel[d.label] ?? 0
    40             if  remindCount > 0
    41             {
    42                 sum += d.val
    43                 usedLabel[d.label] = remindCount - 1
    44                 
    45                 count += 1
    46                 if count == num_wanted { break }
    47             }
    48         }
    49         
    50         return sum
    51     }
    52 }

    192ms

     1 struct Info {
     2     var value: Int
     3     var label: Int
     4 }
     5 
     6 class Solution {
     7     func largestValsFromLabels(_ values: [Int], _ labels: [Int], _ num_wanted: Int, _ use_limit: Int) -> Int {
     8         let count = values.count
     9         var array = [Info]()
    10         for index in 0..<count {
    11             let info = Info(value: values[index], label: labels[index])
    12             array.append(info)
    13         }
    14         array.sort { $0.value > $1.value }
    15         var index = 0
    16         var nums = 0
    17         var sum = 0
    18         var dict = [Int: Int]()
    19         while index < count && nums < num_wanted {
    20             let item = array[index]
    21             if let uses = dict[item.label] {
    22                 if uses + 1 > use_limit {
    23                     index += 1
    24                     continue
    25                 } else {
    26                     dict[item.label] = uses + 1
    27                 }
    28             } else {
    29                 dict[item.label] = 1
    30             }
    31             sum += item.value
    32             nums += 1
    33             index += 1
    34         }
    35         return sum
    36     }
    37 }

    200ms

     1 class Solution {
     2     struct Item {
     3         var value:Int
     4         var label:Int
     5         init(_ value:Int = 0, _ label: Int = 0) {
     6             self.value = value
     7             self.label = label
     8         }
     9     }
    10     func largestValsFromLabels(_ values: [Int], _ labels: [Int], _ num_wanted: Int, _ use_limit: Int) -> Int {
    11         var items = [Item]()
    12         var dict = [Int: Int]()
    13         for i in values.indices {
    14             items.append(Item(values[i], labels[i]))
    15             dict[labels[i], default: 0] = use_limit
    16         }
    17         items.sort(by: { $0.value > $1.value })
    18         // print(items)
    19         var count = num_wanted
    20         var result = 0
    21         for item in items {
    22             if count > 0 && dict[item.label]! > 0 {
    23                 result += item.value
    24                 dict[item.label]! -= 1
    25                 count -= 1
    26             }
    27             
    28             if count == 0 {
    29                 return result
    30             }
    31         }
    32         return result
    33     }
    34 }

    216ms

     1 class Solution {
     2     func largestValsFromLabels(_ values: [Int], _ labels: [Int], _ num_wanted: Int, _ use_limit: Int) -> Int {
     3         var pairs = (0..<values.count).map { (values[$0], labels[$0] ) }
     4         pairs.sort { $0.0 > $1.0 }
     5         var num_left = num_wanted
     6         var selected = [Int:Int]()
     7         var res = 0
     8         for (value, label) in pairs where num_left > 0 && (selected[label] ?? 0) < use_limit {
     9             selected[label] = (selected[label] ?? 0) + 1
    10             res += value
    11             num_left -= 1
    12         }
    13         return res
    14     }
    15 }

    228ms

     1 class Solution {
     2     func largestValsFromLabels(_ values: [Int], _ labels: [Int], _ num_wanted: Int, _ use_limit: Int) -> Int {
     3     let zipped = zip(values, labels).sorted{a,b in
     4         return a.0 > b.0
     5     }    
     6     var used: [Int: Int] = [:] // label: times
     7     var idx = 0
     8     var numChosen = 0
     9     var sum = 0
    10     while idx < values.count {
    11         if used[zipped[idx].1, default: 0] < use_limit {
    12             used[zipped[idx].1, default: 0] += 1
    13             sum += zipped[idx].0
    14             numChosen += 1
    15             if numChosen == num_wanted {
    16                 return sum
    17             }
    18         }
    19         
    20         idx += 1
    21     }
    22     
    23     return sum
    24     }
    25 }

    Runtime: 236 ms

    Memory Usage: 21.6 MB
     1 class Solution {
     2     func largestValsFromLabels(_ values: [Int], _ labels: [Int], _ num_wanted: Int, _ use_limit: Int) -> Int {
     3         var labels = labels
     4         var num_wanted = num_wanted
     5         var v:[[Int]] = [[Int]]()
     6         for i in 0..<values.count
     7         {
     8             v.append([values[i], labels[i]])
     9         }
    10         v = v.sorted(by:{
    11             if $0[0] == $1[0]
    12             {
    13                 return $0[1] >= $1[1]
    14             }
    15             else
    16             {
    17                 return $0[0] >= $1[0]
    18             }
    19         })
    20         
    21         var ret:Int = 0
    22         var f:[Int] = [Int](repeating:0,count:20002)
    23         for i in 0..<v.count
    24         {
    25             if num_wanted == 0 {break}
    26             if f[v[i][1]] < use_limit
    27             {
    28                 f[v[i][1]] += 1
    29                 num_wanted -= 1
    30                 ret += v[i][0]
    31             }
    32         }
    33         return ret
    34     }
    35 }
  • 相关阅读:
    Java并发编程之volatile变量
    mysql以下c连接mysql数据库
    2014年工作中遇到的20个问题:61-80
    2014年工作中遇到的20个问题:61-80
    雷观(一):我的职业发展路线之一
    雷观(一):我的职业发展路线之一
    CentOS下安装和配置MySQL-JDK-Tomcat-Nginx(个人官网环境搭建手册)
    雷观(序)
    雷观(序)
    ITFriend创业阶段的服务器环境搭建手册
  • 原文地址:https://www.cnblogs.com/strengthen/p/11014404.html
Copyright © 2011-2022 走看看