题目如下:

解题思路:本题可以采用贪心算法,因为每条船最多只能坐两人,所以在选定其中一人的情况下,再选择第二个人使得两人的体重最接近limit。考虑到人的总数最大是50000,而每个人的体重最大是30000,因此会有很多人体重一样。这样可以用一个集合set保存体重,再用字典保存每个体重对应的人的数量,可以减少运算量。最后对set进行升序排序,再用双指针的方法,用low指针指向set头部,high指针指向set尾部,分别比较set[low]和set[high]的值,有如下情况:

a. set[low] + set[high] > limit: 表示set[high]的体重人只能一人坐一船,得出boats += dic[set[high]], high -= 1;

b. set[low] + set[high] <= high: 表示可以共坐一船,但这里又要考虑  dic[set[high]] 与  dic[set[low]] 的大小:

b1. dic[set[high]]  > dic[set[low]]  : 得出 boats += dic[set[low]], low += 1;

b2.dic[set[high]]  < dic[set[low]]  : 得出 boats += dic[set[high]], high -= 1;

b3:dic[set[high]]  == dic[set[low]]  : 得出 boats += dic[set[high]], high -= 1,low += 1;

最后当low == high的时候,表示只剩下相同体重的人,这时判断这些人能否共坐一船,得出最终boats的总数。

代码如下:

class Solution(object):
def numRescueBoats(self, people, limit):
"""
:type people: List[int]
:type limit: int
:rtype: int
"""
dic = {}
puniq = []
for i in people:
if i not in dic:
dic[i] = 1
puniq.append(i)
else:
dic[i] += 1
puniq.sort()
boats = 0
low = 0
high = len(puniq) - 1
while low < high:
if puniq[low] + puniq[high] > limit:
boats += dic[puniq[high]]
dic[puniq[high]] = 0
high -= 1
else:
if dic[puniq[low]] > dic[puniq[high]]:
boats += dic[puniq[high]]
dic[puniq[low]] -= dic[puniq[high]]
dic[puniq[high]] = 0
high -= 1
elif dic[puniq[low]] < dic[puniq[high]]:
boats += dic[puniq[low]]
dic[puniq[high]] -= dic[puniq[low]]
dic[puniq[low]] = 0
low += 1
else:
boats += dic[puniq[high]]
dic[puniq[high]] = 0
dic[puniq[low]] = 0
low += 1
high -= 1
if limit >= puniq[high]*2:
boats += ((dic[puniq[high]]/2) + (dic[puniq[high]]%2))
else:
boats += dic[puniq[high]]
#boats += dic[puniq[low]] return boats

最新文章

  1. C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息
  2. Security2:Create User
  3. 无边框窗体和timer控件
  4. iframe在ios下无故扩大的问题探究
  5. 洛谷P1595 信封问题
  6. Java过滤器,SpringMVC拦截器之间的一顺序点关系
  7. Spring框架学习(二)
  8. Android working with Volley
  9. TCP/IP四层模型和OSI七层模型的概念
  10. 分享8款绚丽的HTML5/jQuery特效插件
  11. HTTPS那些事(一) HTTPS原理
  12. HTML高级选项卡(1)————表标签
  13. JS document 获取 html对象的问题
  14. thinkjs——一个字段一种数字代表两种状态
  15. go语言实现https的简单get和post请求
  16. DesigningFormsinAccess2010
  17. Spring Boot 设置静态资源访问
  18. dos 下如何查看环境变量
  19. RSA加密工具类(非对称加密算法)
  20. 安装freepbx后创建sip分机

热门文章

  1. 使用Chrome逆向分析JS实战---分析google网站翻译器原文存放位置
  2. ES与CQRS之旅
  3. malloc函数分配内存失败的常见原因
  4. 阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第7节 内部类_7_内部类的概念与分类
  5. Golang 调用 aws-sdk 操作 S3对象存储
  6. Golang new() vs make()
  7. 44 答疑(三)--join的写法/Simple nested loop join的性能问题/Distinct和group by的性能/备库自增主键问题
  8. 2019寒假作业三:PTA7-1抓老鼠啊~亏了还是赚了
  9. Java相关面试题总结+答案(五)
  10. python 安装成linux中的systemd守护运行