楼主: SDFS
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 求问一道面经算法题,不知道用哪种方法

🔗
sybzd 2022-4-2 04:37:44 | 只看该作者
全局:
今天正好刷到原题。1986
果真是数据规模很小只有14,是二的n次方
回复

使用道具 举报

🔗
HOI3CHI 2022-4-2 05:53:28 | 只看该作者
全局:
a87009751 发表于 2022-4-1 16:10
用一个stack就能greedy了。stack里的元素是船,数组从大到小往船上加,船装满了==limit就pop出去,没装满 ...

还是不太懂 lc原题上大家都backtracking的。
回复

使用道具 举报

🔗
SoWhat0309 2022-4-2 07:18:48 | 只看该作者
全局:
a87009751 发表于 2022-4-1 15:10
用一个stack就能greedy了。stack里的元素是船,数组从大到小往船上加,船装满了==limit就pop出去,没装满 ...

  1. if __name__ == "__main__":
  2.     '''
  3.     其实就是binpacking里用来估算的best fit first decreasing
  4.     '''
  5.     def 迫真贪心881(nums, capacity):
  6.         list.sort(nums)
  7.         start, end, res = 0, len(nums)-1, 0
  8.         ship_room = capacity
  9.         while start <= end:
  10.             print(start, end, res)
  11.             if nums[start] + nums[end] <= ship_room:
  12.                 ship_room -= nums[start] + nums[end]
  13.                 start += 1
  14.                 end -= 1
  15.             elif nums[end] <= ship_room:
  16.                 ship_room -= nums[end]
  17.                 end -= 1
  18.             elif nums[start] <= ship_room:
  19.                 ship_room -= nums[start]
  20.                 start += 1
  21.             else:
  22.                 res += 1
  23.                 ship_room = capacity
  24.         if ship_room == capacity:
  25.             return res
  26.         return res + 1
  27.    
  28.     xs = [1,2,2,2,3,3,2,3,2]
  29.     a = 10
  30.     assert 迫真贪心881(xs, a)==2, "照搬881的greedy做法,被分成了[[1,3,2,3],[2,3,2,2],[2]], 而不是[[1,3,3,3],[2,2,2,2,2]]。如果一个数要被分成很多部分才能完美凑出来,直接sort肯定是可能错过最优解的。"
复制代码
没弄错的话应该是你说那个881的思路,并不保证最优解。
回复

使用道具 举报

🔗
a87009751 2022-4-3 01:52:17 | 只看该作者
全局:
本帖最后由 a87009751 于 2022-4-2 12:56 编辑
SoWhat0309 发表于 2022-4-1 18:18
没弄错的话应该是你说那个881的思路,并不保证最优解。

我补充了,要用min pq。
  1. class Solution {
  2.     public int numRescueBoats(int[] people, int limit) {
  3.         Arrays.sort(people);
  4.         PriorityQueue<Integer> pq = new PriorityQueue<>();
  5.         int i = people.length - 1;
  6.         int count = 0;
  7.         while(i >= 0){
  8.             if(pq.isEmpty()){
  9.                 pq.add(people);
  10.                 i--;
  11.             }
  12.             else{
  13.                 int last = pq.peek();
  14.                 if(last + people < limit){
  15.                     pq.poll();
  16.                     pq.add(last + people);
  17.                 }
  18.                 else if(last + people == limit){
  19.                     pq.poll();
  20.                     count++;
  21.                 }
  22.                 else{
  23.                     pq.add(people);
  24.                 }
  25.                 i--;
  26.             }
  27.         }
  28.         count += pq.size();
  29.         return count;
  30.     }
  31. }
复制代码
回复

使用道具 举报

🔗
SoWhat0309 2022-4-3 02:20:51 | 只看该作者
全局:
a87009751 发表于 2022-4-2 12:52
我补充了,要用min pq。

用PriorityQueue找剩余空间最大的船看上去像那么回事,但你一个数多拆几次一样也不行了啊,能过[1,2,2,2,2,2,3,3,3], 10的case, 到[2,3,3,4,4,4,5,6,7,10],12又不行了。NP完全的题要求精确解而不是估算的话,就是没法套881那种题去贪心的啊。
回复

使用道具 举报

全局:
二分猜最小的size
回复

使用道具 举报

🔗
a87009751 2022-4-3 14:19:33 | 只看该作者
全局:
SoWhat0309 发表于 2022-4-2 13:20
用PriorityQueue找剩余空间最大的船看上去像那么回事,但你一个数多拆几次一样也不行了啊,能过[1,2,2,2, ...

研究了你的case,唯一的解[2, 10], [3,3,6], [4,4,4], [5,7]。贪心确实不行,任何一个数字位置不对就解不出来,我把问题想简单了,谢谢指正。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表