这是小川的第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市,返回累加的最小花费。

public int twoCitySchedCost(int[][] costs) {
Arrays.sort(costs, new Comparator<int[]>() {
public int compare(int[] a, int[] b) {
return (a[0] - a[1]) - (b[0] - b[1]);
}
});
int sum = 0;
for (int i = 0; i < costs.length; ++i) {
if (i < costs.length / 2) {
sum += costs[i][0];
} else {
sum += costs[i][1];
}
}
return sum;
}

03 第二种解法

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

public int twoCitySchedCost2(int[][] costs) {
int N = costs.length/2;
int[][] dp = new int[N + 1][N + 1];
for (int i = 1; i <= N; i++) {
dp[i][0] = dp[i-1][0] + costs[i-1][0];
}
for (int j = 1; j <= N; j++) {
dp[0][j] = dp[0][j-1] + costs[j-1][1];
}
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
dp[i][j] = Math.min(dp[i-1][j] + costs[i+j-1][0],
dp[i][j-1] + costs[i+j-1][1]);
}
}
return dp[N][N];
}

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. 19.8.12 记录Scaffold(脚手架)的常见属性及使用

    Scaffold   有利于我们快速的构建页面,使用也是十分的方便. 下面记录一下其简单的使用方法 Scaffold( appBar: AppBar( title: Text('课程'), ), bo ...

  2. 使用xpath提取页面所有a标签的href属性值

    # -*- coding: utf-8 -*- #1.选取节点 #获取所有的div元素 //div #/代表获取根节点的直接子元素 #获取所有带有id属性的div //div[@id] #2.谓词(索 ...

  3. python时间 time模块和datetime模块

    一.time模块 time模块中时间表现的格式主要有三种: a.timestamp时间戳,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 b.struct_time时间元组,共 ...

  4. 前端有用JavaScript技巧

    数组去重 //法1 var arr = [1, 2, 3, 3, 4]; console.log(...new Set(arr)) // [1, 2, 3, 4] //法2 function SetA ...

  5. Oracle体系结构2

    Buffer Cache 作用:缓存dbf中的数据 例子:A和B重复访问同一张表的几率是很大的,如果每次访问dbf时都要发生物理IO,这样会导致数据库的性能非常低 由于这个例子,当一个进程访问dbf时 ...

  6. JS实现 Tab栏切换案例

    要求:当鼠标点击上面相应的选项卡(tab),下面页面的内容也随之而改变. 结构分析: 全部的内容都放到一个大的盒子里面,盒子里面又可以分为上面和下面两个盒子. 上面的盒子放了 5个li,装着5个小的选 ...

  7. Nagios-报错:UNKNOWN Can't connect to the JVM:

    原因: 由于手动开启nrpe程序,产生临时文件,需要把产生的多余文件删除. [root@nagios ~]# ll /tmp/drwx------ 3 root root 17 Aug 12 13:4 ...

  8. win10 1903 更改文字大小

    标题栏 - 菜单 - 消息框 - 调色板标题11- 图标 - 工具提示 - Caption 标题 的 宽/高 - ; 14的宽高 - 菜单 的 宽/高 - ; 的宽高 -; 设置 注册表 HKEY_C ...

  9. [转] Linux环境变量配置文件以及启动顺序

    转自:https://blog.csdn.net/bjnihao/article/details/51775854 一.环境变量配置文件: 对所有用户都起作用 /etc/profile /etc/pr ...

  10. C# 两个进程之间通讯(管道通信 )

    #region  客户端        NamedPipeClientStream pipeClient =        new NamedPipeClientStream("localh ...