Java C++ 题解leetcode857雇佣K名工人最低成本vector pair

目录
  • 题目要求
  • 思路:优先队列 + 贪心
    • Java
    • C++
    • Rust

题目要求

思路:优先队列 + 贪心

Java

class Solution {
    public double mincostToHireWorkers(int[] quality, int[] wage, int k) {
        int n = quality.length;
        double[][] ratio = new double[n][2];
        for (int i = 0; i < n; i++) {
            ratio[i][0] = wage[i] * 1.0 / quality[i];
            ratio[i][1] = quality[i] * 1.0;
        }
        Arrays.sort(ratio, (a, b) -> Double.compare(a[0], b[0]));
        PriorityQueue<Integer> pq = new PriorityQueue<>((a, b) -> b - a);
        double res = 1e18;
        for (int i = 0, tot = 0; i < n; i++) {
            int cur = (int) ratio[i][1];
            tot += cur;
            pq.add(cur);
            if (pq.size() > k)
                tot -= pq.poll();
            if (pq.size() == k)
                res = Math.min(res, tot * ratio[i][0]);
        }
        return res;
    }
}
  • 时间复杂度:O(n log ⁡n)
  • 空间复杂度:O(n)

C++

学习了一下vectorpair的相互套用,以及自定义排序等内容。

class Solution {
public:
    double mincostToHireWorkers(vector<int>& quality, vector<int>& wage, int k) {
        int n = quality.size();
        vector<pair<double, int>> ratio;
        for (int i = 0; i < n; i++) {
            ratio.emplace_back(wage[i] * 1.0 / quality[i], quality[i]);
        }
        sort(ratio.begin(), ratio.end(), [](const pair<double, int> &a, const pair<double, int> &b) {
            return a.first < b.first;
        });
        priority_queue<int> pq;
        double res = 1e18;
        for (int i = 0, tot = 0; i < n; i++) {
            int cur = ratio[i].second;
            tot += cur;
            pq.emplace(cur);
            if (pq.size() > k) {
                tot -= pq.top();
                pq.pop();
            }
            if (pq.size() == k)
                res = min(res, tot * ratio[i].first);
        }
        return res;
    }
};
  • 时间复杂度:O(n log ⁡n)
  • 空间复杂度:O(n)

Rust

use std::collections::BinaryHeap;
impl Solution {
    pub fn mincost_to_hire_workers(quality: Vec<i32>, wage: Vec<i32>, k: i32) -> f64 {
        let (mut res, mut tot, mut pq) = (f64::MAX, 0, BinaryHeap::new());
        let mut ratio = quality.iter().zip(wage.iter()).map(|(q, w)| (*w as f64 / *q as f64, *q as f64)).collect::<Vec<_>>();
        ratio.sort_by(|a, b| a.0.partial_cmp(&b.0).unwrap());
        for (a, b) in ratio {
            tot += b as i32;
            pq.push(b as i32);
            if pq.len() as i32 > k {
                tot -= pq.pop().unwrap();
            }
            if pq.len() as i32 == k {
                res = res.min(a * tot as f64);
            }
        }
        res
    }
}
  • 时间复杂度:O(n log⁡ n)
  • 空间复杂度:O(n)

以上就是Java C++ 题解leetcode857雇佣K名工人最低成本vector pair的详细内容,更多关于Java C++ vector pair的资料请关注我们其它相关文章!

(0)

相关推荐

  • Java中的Pair详细

    目录 1 Pair用法 2 Pair源码 3 ImmutablePair源码 4 MutablePair源码 5 疑问? 前言: Java中的Pair在开发的过程中,无意中发现项目中有用到Pair,对于我之前从来没有遇到过这个东西,觉得这个东西挺有意思,所以就记录下. 在我们写代码的时候,肯定会遇到要返回两个值,但是这两个值都有用到,所以我们一般都会用map集合进行key-value封装,或者写一个类来封装两个属性来返回,但是这两种方式虽然实现起来简单,但是感觉有点浪费类或者不美观,如果大量的出

  • 浅析java中Pair和Map的区别

    在这篇文章中,我们讨论了一个非常有用的编程概念,配对(Pair).配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用. 在核心Java库中可以使用配对(Pair)的实现.除此之外,某些第三方库,比如Apache Commons和Vavr,已经在各自的api中公开了这个功能. 核心java配对实现 Pair类 Pair类在javafx.util 包中,类构造函数有两个参数,键及对应值: Pair<Integer, String> pair = new Pair<

  • javax.net.ssl.SSLException: java.lang.RuntimeException: Could not generate DH keypair 解决方法总结

    解决这个异常的重点就在于下载两个jar包: bcprov-ext-jdk15on-1.52 bcprov-jdk15on-1.52 传送门:https://pan.baidu.com/s/1c563m9gR-t1v9X-qYfE9EA 提取码vsuj 然后下载完毕之后就需要将这两个jar包放到 $JAVA_HOME/jre/lib/ext 放在指定的目录下之后,接下来就需要对一个文件进行编辑 这个文件的位置在 $JAVA_HOME/jre/lib/security/ 对这个路径下的java.se

  • 介绍java中Pair(配对)

    目录 介绍java中Pair 核心java配对实现 Pair类 AbstractMap.SimpleEntry 和 AbstractMap.SimpleImmutableEntry Apache Commons Vavr库 总结 介绍java中Pair 在这篇文章中,我们讨论了一个非常有用的编程概念,配对(Pair).配对提供了一种方便方式来处理简单的键值关联,当我们想从方法返回两个值时特别有用. 关于Java中的Pair用法 在核心Java库中可以使用配对(Pair)的实现.除此之外,某些第三

  • Java C++题解 leetcode第k个数实例

    目录 题目要求 思路一:小根堆 Java C++ 思路二:多路归并[多指针] Java C++ Rust 总结 题目要求 思路一:小根堆 中文题目描述不太清晰,但其实由题目可以发现,当x满足条件时,3x.5x.7x分别也都满足条件. 将满足条件的数依次放入优先队列存放用于后续计算,由于每次要取待计算队列中最小的数x,所以定义小根堆: 弹出x,计算3x.5x.7x并入队: 用一个哈希表记录防止重复入队. 每次取数(pop)时进行计数,到第k次结束,当前队首即为答案. Java <学到了> 1L也

  • Java C++题解leetcode字符串轮转KMP算法详解

    目录 题目要求 思路一:双指针(模拟) Java C++ 思路二:子串 手写KMP Java dp C++ dp 调API Java C++ 总结 题目要求 思路一:双指针(模拟) Java class Solution { public boolean isFlipedString(String s1, String s2) { if (s1.length() != s2.length()) return false; int n = s1.length(); if (n == 0) retu

  • Java C++题解leetcode672灯泡开关示例

    目录 题目要求 思路:找规律 Java C++ Rust 总结 题目要求 思路:找规律 找到尽可能最精简的通项表达,今日参考:京城打工人 首先,归纳每个开关会影响的灯,其中(k=0,1,2,…): 开关 反转灯编号 一 k 二 2k 三 2k+1 四 3k+1 可见灯以6盏为周期具有相同变化,所以以下只需要推导第一个周期里的6盏灯即可. 观察前6盏灯: 灯 开关 1 一.三.四 2 一.二 3 一.三 4 一.二.四 5 一.三 6 一.二 发现灯2.6和3.5分别受同样的开关影响,所以状态相同

  • Java C++题解leetcode886可能的二分法并查集染色法

    目录 题目要求 思路一:反向点+并查集 浅学并查集(Union Find) Java C++ 思路二:染色法 Java C++ 总结 题目要求 思路一:反向点+并查集 根据题意不喜欢就不在一个组可以想到使用并查集,本题是两个集合所以对每一个节点引入一个反向点,使两者分属于不同集合,借此记录前续节点维持的不喜欢关系: 在将每个节点xxx放入组合时,同时将其反向节点x+nx+nx+n放入另一组合,然后向后遍历依次处理每个节点,同时判断相互不喜欢的两个点当前是否会被迫放入一个集合(连通),若是则无法满

  • java算法题解Leetcode15三数之和实例

    目录 题目 解题思路 题目 15. 三数之和 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 注意:答案中不可以包含重复的三元组. 示例 1:输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]示例 2:输入:nums = []输出:[]示例 3:输入:nums = [0]输出:[]提示:0 <= nums.length <=

  • Java输出链表倒数第k个节点

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } } 思路1: 先遍历链表,计算其长度length; 然后计算出倒数第k个结点就是正数第length - k + 1. 最后再遍历链表,找到所求结点 时间复杂度O(2n),需要遍历两次链表 代码如下: public List

  • 利用Java如何获取IP与机器名方法示例

    前言 本文详细给大家介绍了关于利用Java如何获取IP与机器名的方法示例,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 一.通过IP获取机器名 or 通过机器名获取ip host :主机        hostAddress :ip       hostName:机器名 import java.net.InetAddress; import java.net.UnknownHostException; public class Test01 { public static voi

  • Java 获取当前类名和方法名的实现方法

     Java 获取当前类名和方法名的实现方法 这里提供了四种方法并比较,大家需要的可以参考下,          为了测试各个函数,如果手动打印每个类名.函数名,那么多函数的话能把人累死,Java早已准备好了一堆记录自身的函数. 获取类名: public static void testGetClassName() { // 方法1:通过SecurityManager的保护方法getClassContext() String clazzName = new SecurityManager() {

  • 利用反射获取Java类中的静态变量名及变量值的简单实例

    JAVA可以通过反射获取成员变量和静态变量的名称,局部变量就不太可能拿到了. public class Test { public static void main(String[] args) throws Exception { // TODO Auto-generated method stub //获取所有变量的值 Class clazz = Class.forName("com.qianmingxs.ScoreTable"); Field[] fields = clazz.g

  • Java获取代码中方法参数名信息的方法

    前言 大家都知道随着java8的使用,在相应的方法签名中增加了新的对象Parameter,用于表示特定的参数信息,通过它的getName可以获取相应的参数名.即像在代码中编写的,如命名为username,那么在前台进行传参时,即不需要再编写如@Parameter("username")类的注解,而直接就能进行按名映射. 如下的代码参考所示: public class T { private interface T2 { void method(String username, Stri

随机推荐