这是小川的第383次更新,第412篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第245题(顺位题号是1029)。公司计划采访的人数为2N。将第i个人飞往城市A的费用是[i][0],将第i个人飞到城市B的费用是费用[i][1]

返回将每个人带到一个城市的最低费用,这样每个城市就会有N个人到达。

例如:

输入:[[10,20],[30,200],[400,50],[30,20]]

输出:110

说明:

第一个人去城市A,费用为10。

第二个人去城市A,费用为30。

第三个人去B市,费用为50。

第四个人去B市,费用为20。

总体最低费用为10 + 30 + 50 + 20 = 110,每个城市有一半的人在采访。

注意

  • 1 <= costs.length <= 100

  • 保证cost.length是偶数。

  • 1 <= cost[i][0]cost[i][1] <= 1000

02 第一种解法

我们可以通过计算去A市、B市之间花费的差值cost[i][0]-cost[i][1],来判断哪一部分人去A市,哪一部分人去B市,差值最小的人去A市,因为差值越小,去A市是越省钱的。只要把去A市的人确定了,剩下的都去B市就行。

结合题目的示例来看,原数组是[[10,20],[30,200],[400,50],[30,20]],计算去A市、B市之间花费的差值,数组变成了[-10,-170,350,10],将差值数组排序后,得到[-170,-10,10,350],前面的两个差值去A市,后面的两个差值去B市。其中差值最小的一组是[30,200],它们的差值是-170,去A市比去B市少花170,所以去A市更加省钱。

思路:借助Arrayssort方法,重写compare方法,遍历按照差值排序后的数组,前一半元素取A市,后一半元素去B市,返回累加的最小花费。

  1. public int twoCitySchedCost(int[][] costs) {
  2. Arrays.sort(costs, new Comparator<int[]>() {
  3. public int compare(int[] a, int[] b) {
  4. return (a[0] - a[1]) - (b[0] - b[1]);
  5. }
  6. });
  7. int sum = 0;
  8. for (int i = 0; i < costs.length; ++i) {
  9. if (i < costs.length / 2) {
  10. sum += costs[i][0];
  11. } else {
  12. sum += costs[i][1];
  13. }
  14. }
  15. return sum;
  16. }

03 第二种解法

利用动态规划来解,此方法来自讨论区,传送门:https://leetcode.com/problems/two-city-scheduling/discuss/278731/Java-DP-Easy-to-Understand

  1. public int twoCitySchedCost2(int[][] costs) {
  2. int N = costs.length/2;
  3. int[][] dp = new int[N + 1][N + 1];
  4. for (int i = 1; i <= N; i++) {
  5. dp[i][0] = dp[i-1][0] + costs[i-1][0];
  6. }
  7. for (int j = 1; j <= N; j++) {
  8. dp[0][j] = dp[0][j-1] + costs[j-1][1];
  9. }
  10. for (int i = 1; i <= N; i++) {
  11. for (int j = 1; j <= N; j++) {
  12. dp[i][j] = Math.min(dp[i-1][j] + costs[i+j-1][0],
  13. dp[i][j-1] + costs[i+j-1][1]);
  14. }
  15. }
  16. return dp[N][N];
  17. }

04 小结

算法专题目前已连续日更超过七个月,算法题文章251+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode.1029-两城调度(Two City Scheduling)的更多相关文章

  1. [Swift]LeetCode1029. 两地调度 | Two City Scheduling

    There are 2N people a company is planning to interview. The cost of flying the i-th person to city A ...

  2. 【Leetcode_easy】1029. Two City Scheduling

    problem 1029. Two City Scheduling 参考 1. Leetcode_easy_1029. Two City Scheduling; 完

  3. LeetCode 445——两数相加 II

    1. 题目 2. 解答 2.1 方法一 在 LeetCode 206--反转链表 和 LeetCode 2--两数相加 的基础上,先对两个链表进行反转,然后求出和后再进行反转即可. /** * Def ...

  4. Leetcode 002. 两数相加

    1.题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表 ...

  5. LTE:上行调度请求(Scheduling Request,SR) LTE:下行资源分配类型

    http://blog.sina.com.cn/s/blog_927cff010101a7yh.html 上行调度请求(Scheduling Request,SR) 如果UE没有上行数据要传输,eNo ...

  6. 前端与算法 leetcode 350. 两个数组的交集 II

    目录 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 概要 提示 解析 解法一:哈希表 解法二:双指针 解法三:暴力法 算法 # 前端与算法 leetcode 350. 两 ...

  7. 前端与算法 leetcode 1. 两数之和

    目录 # 前端与算法 leetcode 1. 两数之和 题目描述 概要 提示 解析 解法一:暴力法 解法二:HashMap法 算法 传入[1, 2], [11, 1, 2, 3, 2]的运行结果 执行 ...

  8. leetcode python两整数之和

    # Leetcode 371 两整数之和***### 题目描述 **不使用**运算符 `+` 和 `-` ​​​​​​​,计算两整数 `​​​​​​​a `.`b` ​​​​​​​之和. **示例1: ...

  9. LeetCode:两数之和、三数之和、四数之和

    LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...

随机推荐

  1. [易学易懂系列|rustlang语言|零基础|快速入门|(15)|Unit Testing单元测试]

    [易学易懂系列|rustlang语言|零基础|快速入门|(15)] 实用知识 Unit Testing单元测试 我们知道,在现代软件开发的过程中,单元测试对软件的质量极及重要. 今天我们来看看Rust ...

  2. noi.ac NA534 【猫】

    一眼暴力DP 再一眼决策单调性? 打个表以为是四边形不等式?? 最后发现是斜率优化??? 于是成功写了个假斜率优化真四边形不等式拿了\(80\) 设\(f[i][j]\)表示有\(i\)个工作人员出发 ...

  3. **JAVA参数传递方式 (按值传递与引用传递区别)

    https://blog.csdn.net/q5706503/article/details/82910428public class TestMain { public static void ma ...

  4. qt5--文件操作

    文本文件的读写操作: #include "win.h" #include "ui_win.h" #include <QDebug> #include ...

  5. 输出1~n中1的个数

    //输出1~n中1的个数,如f(1)=1,f(13)=6.通过测试,bymyself public class FindOnes{ public static void main(String arg ...

  6. libkmcuda安装

    编译安装 1,前期准备 git clone https://github.com/src-d/kmcuda cd kmcuda/src/ 例如: cmake -DCMAKE_BUILD_TYPE=Re ...

  7. [RCTF]Pwn200 wp

    0x00: XCTF开赛了,只看了pwn,这次还比较有意思,有x86  x64  arm mips 多种cpu构架的pwn.自己只搞出了pwn200 0x01: 基本信息: x64 动态链接 有调试符 ...

  8. C# 获取 与 修改 web.config中的值(修改Xml文件)

    定义web.config 中 appSettings 节点 <appSettings> <add key="domainExist" value="fa ...

  9. Confluence 6 Office 和 PDF 文件

    插入一个文件到页面中是能够让你将有用的文件,电子表格,幻灯片或者其他可用的文件在你小组中进行分享的好方法. 针对所有的文件类型,你可以选择以链接方式插入一个文件.缩略图将会对文档的内容进行预览同时可以 ...

  10. Mybatis 结果映射下划线转驼峰

    mybatis 结果映射下划线转驼峰 Spring Boot 配置: #下划线转驼峰 mybatis.configuration.map-underscore-to-camel-case=true m ...