闲聊

不知不觉,从开始发算法博客到如今已经过了半月,在这个过程中其实也遇到过很多困难,也一度想过要放弃,深刻体会到没有任何一件事情是可以简简单单敷衍过去的,特别能体会那些工作之余还能十年如一日坚持技术文章创作的作者们的不容易。不过尽管辛苦也有很多收获,比如精益求精,更追求更完美,又比如收获了很多技术以外的知识,认识了更多的朋友,视野也更加开阔。犹记得第一次投稿成功,第一次文章被大的专栏收录,第一次有人点赞,第一次有粉丝关注,甚至第一次某平台粉丝破百的时候内心的喜悦...

未来,希望自己能把算法博客当成爱好一直写下去,也希望能这些文章能给有需要的朋友带来实际的帮助。在后续博文推送过程中,不排除也有些疏漏或者思维理解上的误区,欢迎交流或批评指正。

概要

上一篇博客《LeetCode进阶944-贪心》,有朋友提出建议944对理解贪心算法并不具有很强的代表性。回顾了下上篇的内容,实际文中博主重点说明的是算法优化的小技巧,题解思路也仅仅只是简单的统计法,对贪心思想实际帮助确实不大。基于此博主已将上篇博客标题更正为《LeetCode进阶944-算法优化》(除订阅号由于微信公众平台的限制,标题暂时无法修改),而本篇将以leetcode1029为实例,讲解贪心算法思想。

原题

1029. Two City Scheduling

There are 2N people a company is planning to interview. The cost of flying the i-th person to city A is costs[i][0], and the cost of flying the i-th person to city B is costs[i][1].

Return the minimum cost to fly every person to a city such that exactly N people arrive in each city.

Example 1:

Input: [[10,20],[30,200],[400,50],[30,20]]

Output: 110

Explanation:

The first person goes to city A for a cost of 10.

The second person goes to city A for a cost of 30.

The third person goes to city B for a cost of 50.

The fourth person goes to city B for a cost of 20.

The total minimum cost is 10 + 30 + 50 + 20 = 110 to have half the people interviewing in each city.

Note:

1 <= costs.length <= 100

It is guaranteed that costs.length is even.

1 <= costs[i][0], costs[i][1] <= 1000

1029. 面试安排(据题意命名)

公司安排2N个人参加面试。第i个人坐飞机飞到城市A的费用为costs[i][0],飞到城市B的费用为 costs[i][1]。

返回安排好每个人都前往某城市面试的最低费用,A、B城市各有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

costs.length 为偶数

1 <= costs[i][0], costs[i][1] <= 1000

  • 本题在LeetCode上属于贪心算法分类下

题意分析

需要将2N个人分成两组,分别送往A、B城市面试,每个人去A、B城市的费用已知,要保证总费用最少。凡事涉及最大最小值求和相关的题型,自然不难联想到贪心算法思想,贪心思想最典型的问题是“背包问题”,关于贪心思想需要注意的是,一定要确保“贪心”的思路正确即能拿到最优解,实践过程中可以具体进行数值带入验证。

思路设计

根据题意,需要的最优解是花费最少的钱分别安排N个人前往A、B面试,每个人前往A、B城市的花费有个价格差。可以这简单这么理解我们可以统一计算出每个人前往B城市比前往A城市需要多花的钱(也可以是前往A城市比前往B城市要多花的钱),然后进行排序,价格差最大的排名第一的人必然只能安排到A城市,这样能省下的成本费用最大。接着依次往后安排,排第二的人也只能安排到A城市,一直到安排了排第N的人到A城市,剩下的N个人由于前往B城市比前往A城市花费没那么高全部排到B城市。

伪代码:

1、新建一个大小和人数一致的int数组sort,用于保存每个人前往B城市比前往A城市多花费的费用(注意费用可以是负数,负数等价理解花费更少);

2、遍历costs花费数组,将差值记录在sort数组元素中;

i.计算第i个人前往B和前往A的差值;

ii.差值左移8位;

iii.左移后加上当前在cost数组中的下标位置i;

3、对差值sort数组进行排序;

4、声明一个int变量min表示最小花费总和,循环遍历sort数组,遍历次数只需人数的一半costs.length/2;

i.对于差值排名前N,即sort中最后的N个人,选择去A城市的花费,根据sort元素存储的在costs数组中的下标位置从costs数组中获取去A城市的花费;

ii.对于差值排名后N,即sort中前N个人,选择去B城市的花费,根据sort元素存储的在costs数组中的下标位置从costs数组中获取去B城市的花费;

iii.min累加所有总花费;

编码实践

public int twoCitySchedCost(int[][] costs) {

int sort[] = new int[costs.length];

for (int i = 0; i < costs.length; ++i) {

sort[i] = ((costs[i][1] - costs[i][0]) << 8) + i;

}

Arrays.sort(sort);

int min = 0;

for (int i = 0; i < sort.length / 2; ++i) {

int index1 = sort[costs.length - 1 - i] & 0xFF;

int index2 = sort[i] & 0xFF;

min = min + costs[index1][0] + costs[index2][1];

}

return min;

}

彩蛋

观察上面实现代码会发现在sort数组中存储前往B和A城市int差价和在costs数组中下标位置时,使用了左移8位再加i的操作,这便是本文的彩蛋,所有彩蛋均会在后续推文中统一说明。

结语

本文重点在与列举1029实例展示对贪心思想的理解,思路相对简单易于理解,并且从提交结果可以看出贪心思想算法的实践代码效率已经击败了99%的算法,故对另外解法穷举法便不做详细说明,读者可以考虑自己使用穷举法进行实现。关于leetcode进阶系列博客,后续也会疏理出一篇比较系统的进阶大纲,敬请期待^_^

扫一扫 关注我的微信订阅号

leetcode 贪心_LeetCode进阶1029-贪心相关推荐

  1. LeetCode算法题6:贪心 - 跳跃游戏

    文章目录 前言 贪心算法: 一.跳跃游戏 思路 二.跳跃游戏II 思路 总结 前言 贪心算法系列:(之前还有一篇文章描述的也是贪心算法:https://blog.csdn.net/Little_ant ...

  2. leetcode与python进阶学习总结

    转自:leetcode与python进阶学习总结 l1是一个链表型,val是其属性,以下句子意义为如果l1不为空则取l1.val否则取0,节省代码空间,干净利落 x= l1.val if l1 els ...

  3. Python正则表达式中的贪心模式和非贪心模式

    声明:最近发现有人利用我在百度云盘里免费分享的127课Python视频盈利,并声称获得我的授权.在此,我声明,文末百度云盘里的Python视频是免费的,不会授权给任何人或机构进行销售.如果再发现有人卖 ...

  4. python贪心算法最短路径_贪心算法---最短路径问题

    一,贪心算法的设计思想 • 从问题的某一个初始解出发逐步逼近给定的目标,每一步都作一个不可回溯的决策,尽可能地求得最好的解.当达到某算法中的某一步不需要再继续前进时,算法停止. 二,贪心算法的基本性质 ...

  5. 1/22 测试一(STL 模拟 贪心)C.(贪心,给出气球,输出最好成绩)Contest Balloons

    1/22 测试一(STL 模拟 贪心) C.(贪心,给出气球,输出最好成绩)Contest Balloons One tradition of ACM-ICPC contests is that a ...

  6. leetcode 贪心_leetcode题解(贪心算法)

    定义 贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择. 也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解. 通常贪心算法的代码会非常短而且思路也非常 ...

  7. 157. Leetcode 674. 最长连续递增序列 (贪心算法-进阶题目)

    class Solution:def findLengthOfLCIS(self, nums: List[int]) -> int:ans, start = 0, 0for i in range ...

  8. 156. Leetcode 53. 最大子数组和 (贪心算法-进阶题目)

    class Solution:def maxSubArray(self, nums: List[int]) -> int:result = -float('inf')count = 0for i ...

  9. LeetCode 376. 摆动序列(贪心 动态规划)

    文章目录 1. 题目 2. 解题 2.1 贪心 2.2 动态规划 1. 题目 如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列.第一个差(如果存在的话)可能是正数或负数.少于两个 ...

最新文章

  1. tomcat屏蔽ip
  2. Boost:逐步定义的测试程序
  3. 20170914-构建之法:现代软件工程-阅读笔记
  4. 在js语法中使用jsx标签
  5. matlab压控振荡器,MATLAB仿真应用_第5章(1)解析.ppt
  6. 夜来香——暗恋的滋味
  7. [stm32] 利用uc-gui封装画图和画线函数移植51上的模拟动画
  8. swarm部署mysql_「实战篇」开源项目docker化运维部署-借助dockerSwarm搭建集群部署(九)...
  9. 筑业软件加密锁驱动_如何在不使用额外软件的情况下对USB驱动器进行加密和密码保护...
  10. 制作种子怎么上传服务器,怎么做种子,又怎么发布呢?
  11. EXP-00091 Exporting questionable statistics
  12. 小书童开源免费的二维码批量生成工具
  13. 数据结构—双向链表的基本操作
  14. 漫天杂想系列之五:2018年总结
  15. 连缀介绍和简单库对象
  16. 基于TI-RTOS的CC2650DK开发(20)---硬件抽象层
  17. 小学生学Arduino------制作智能灯
  18. HEVC解码器解码出现failed to open bitstream file ‘str.bin‘ for reading的问题解决方法记录
  19. Ubuntu 安装企业微信
  20. LogicFlow从新手到入门

热门文章

  1. outdated: 17.2D Texture Font
  2. 注册DirectShow filter时应该注意中文路径
  3. Mysql 日志系统 redo log 和 binlog
  4. LeetCode 90.子集 II 中等难度
  5. ARM 嵌入式入门经验
  6. 指纹识别市场前景广阔,2020年我国或破18亿美元
  7. Python3高并发定时更新任务进程池和线程池的使用
  8. 高速电路EDA设计第一次实验
  9. pythontuple数据类型_Python数据类型之元组的详细介绍
  10. 华为p30是不是鸿蒙芯片,鸿蒙OS+麒麟1020 5G芯片华为P50 Pro,华为P30沦为白菜机改写历史...