LeetCode.1029-两城调度(Two City Scheduling)
这是小川的第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市更加省钱。
思路:借助Arrays的sort方法,重写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)的更多相关文章
- [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 ...
- 【Leetcode_easy】1029. Two City Scheduling
problem 1029. Two City Scheduling 参考 1. Leetcode_easy_1029. Two City Scheduling; 完
- LeetCode 445——两数相加 II
1. 题目 2. 解答 2.1 方法一 在 LeetCode 206--反转链表 和 LeetCode 2--两数相加 的基础上,先对两个链表进行反转,然后求出和后再进行反转即可. /** * Def ...
- Leetcode 002. 两数相加
1.题目描述 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表 ...
- LTE:上行调度请求(Scheduling Request,SR) LTE:下行资源分配类型
http://blog.sina.com.cn/s/blog_927cff010101a7yh.html 上行调度请求(Scheduling Request,SR) 如果UE没有上行数据要传输,eNo ...
- 前端与算法 leetcode 350. 两个数组的交集 II
目录 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 概要 提示 解析 解法一:哈希表 解法二:双指针 解法三:暴力法 算法 # 前端与算法 leetcode 350. 两 ...
- 前端与算法 leetcode 1. 两数之和
目录 # 前端与算法 leetcode 1. 两数之和 题目描述 概要 提示 解析 解法一:暴力法 解法二:HashMap法 算法 传入[1, 2], [11, 1, 2, 3, 2]的运行结果 执行 ...
- leetcode python两整数之和
# Leetcode 371 两整数之和***### 题目描述 **不使用**运算符 `+` 和 `-` ,计算两整数 `a `.`b` 之和. **示例1: ...
- LeetCode:两数之和、三数之和、四数之和
LeetCode:两数之和.三数之和.四数之和 多数之和问题,利用哈希集合减少时间复杂度以及多指针收缩窗口的巧妙解法 No.1 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在 ...
随机推荐
- POJ - 2774 Long Long Message (后缀数组/后缀自动机模板题)
后缀数组: #include<cstdio> #include<algorithm> #include<cstring> #include<vector> ...
- 关于enter事件的触发
如果您使用了antd的Button组件,那么恭喜已经封装好了,只要加上htmlType='submit', 如果没有使用其他框架,使用onPress或者onKeydown事件,判断e.keycode ...
- 20.包含min函数的栈(python)
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). # -*- coding:utf-8 -*- class Solution: def ...
- wx小程序知识点(四)
四.页面间数据传递 和 参数传值 (1)页面间数据传递 ① 全局变量 ② 页面跳转或重定向时使用url携带参数(wx.navigateTo(urlStr)) ③ 使用组件模板 template < ...
- jquery isDefaultPrevented()方法 语法
jquery isDefaultPrevented()方法 语法 作用:isDefaultPrevented() 方法返回指定的 event 对象上是否调用了 preventDefault() 方法. ...
- css之页面透明
能使元素变的透明的方法有: 1.Opacity 2.RGBA opacity会使后代元素都透明,而RGBA不会!
- react-router中,<switch>
有<Switch>标签,则其中的<Route>在路径相同的情况下,只匹配第一个,这个可以避免重复匹配: 无<Switch>标签,则其中的<Route>在 ...
- C语言 - strcmp和strncmp的编程实现及总结
一.strcmp和strncmp的编程实现及总结 1.strcmp函数的实现 要求: 原型: int strcmp(char *dest,char * src,int n); 头文件:# ...
- POJ 1430 Binary Stirling Numbers (第二类斯特林数、组合计数)
题目链接 http://poj.org/problem?id=1430 题解 qaq写了道水题-- 在模\(2\)意义下重写一下第二类Stirling数的递推式: \[S(n,m)=S(n-1,m-1 ...
- numpy中双冒号的作用
import numpy as np a = np.array([[1, 2, 3, 1, 3, 5], [4, 5, 6, 2, 4, 3]]) print('a') print(a) print( ...