12
返回列表 发新帖
楼主: AmberCBDP
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] Leetcode#315: 大家帮忙看看

🔗
htcgo 2020-9-30 14:40:15 来自APP | 只看该作者
全局:
楼主代码不是二分复杂度

评分

参与人数 1大米 +1 收起 理由
AmberCBDP + 1 赞一个!

查看全部评分

回复

使用道具 举报

🔗
ahao99 2020-9-30 15:07:26 | 只看该作者
全局:
二分是不能有递归的,你这个二分不是O(logn)的
回复

使用道具 举报

🔗
大成若缺 2020-9-30 15:21:40 | 只看该作者
全局:
你这个内循环+外循环双循环是O(n^2)

评分

参与人数 1大米 +1 收起 理由
AmberCBDP + 1 赞一个!

查看全部评分

回复

使用道具 举报

🔗
 楼主| AmberCBDP 2020-9-30 23:05:21 来自APP | 只看该作者
全局:
本帖最后由 AmberCBDP 于 2020-9-30 23:58 编辑
格林匹施ZELQ 发表于 2020-09-29 23:06:25
add在特定位置的复杂度是O(n),你的方法还是平方的复杂度

谢谢,我也怀疑过。特定位置加的时候,找到那个特定位置-》要遍历走到特定位置,所以是O(n).

不过我这两个O(n*n)的解法,英文版的leetcode, 二分的不过,另一个过了,也挺有意思的,应该二分更超时。
回复

使用道具 举报

🔗
 楼主| AmberCBDP 2020-9-30 23:27:04 | 只看该作者
全局:
本帖最后由 AmberCBDP 于 2020-10-1 00:18 编辑
ahao99 发表于 2020-9-30 15:07
二分是不能有递归的,你这个二分不是O(logn)的

这不是问题的关键所在,下面这个不是递归版,同样超时。问题是add()在特定位置是O(n), 二分那个找插入位置index是O(logn), 所以总耗时O(n*(n+logn))=O(n*n)


  1. public List<Integer> countSmaller(int[] nums)
  2. {
  3.         int size = nums.length;
  4.         List<Integer> ans= new ArrayList<>();
  5.         List<Integer> list = new LinkedList<>();
  6.         if(size==0)
  7.             return ans;
  8.         //add nums[size-1], and count=0
  9.         list.add(0,nums[size-1]);   
  10.         ans.add(0,0);
  11.         int low,high,index;
  12.         for(int i=size-2;i>=0;i--)
  13.         {
  14.             low=0;high=list.size()-1;
  15.             while(low!=high)
  16.             {
  17.                 int mid=(low+high)/2;
  18.                 if(list.get(mid)<nums[i])
  19.                     low=mid+1;
  20.                 else
  21.                     high=mid;
  22.             }
  23.             index=(list.get(low)<nums[i])?(low+1):low;
  24.             list.add(index,nums[i]);
  25.             ans.add(0,index);
  26.         }
  27.         return ans;
  28. }
复制代码
[/i][/i][/i]
回复

使用道具 举报

🔗
 楼主| AmberCBDP 2020-10-1 00:25:08 来自APP | 只看该作者
全局:
格林匹施ZELQ 发表于 2020-9-30 14:06
add在特定位置的复杂度是O(n),你的方法还是平方的复杂度

在头加元素呢,我觉得是O(1)而不是O(n)?另一个已经知道是O(n)了,谢谢指出。
这个操作看一下ans.add(0,index);?

补充内容 (2020-10-1 00:31):
已经知道了,链表有头尾节点,所以这个操作是O(1)

补充内容 (2020-10-1 01:15):
ArrayList, 头部插入O(n);
LinkedList,头部插O(1)—&gt;addFirst()
回复

使用道具 举报

🔗
 楼主| AmberCBDP 2020-10-1 02:42:13 | 只看该作者
全局:
这个是我总结的,如有不对,请大家指正。
回复

使用道具 举报

🔗
david_smith 2020-10-1 08:55:26 | 只看该作者
全局:
AmberCBDP 发表于 2020-10-1 02:42
这个是我总结的,如有不对,请大家指正。

正确,但是这道题小于O(n^2)的算法是需要更复杂的数据结构才行

评分

参与人数 1大米 +1 收起 理由
AmberCBDP + 1 赞一个

查看全部评分

回复

使用道具 举报

🔗
 楼主| AmberCBDP 2020-10-1 10:12:58 来自APP | 只看该作者
全局:
david_smith 发表于 2020-09-30 17:55:26
正确,但是这道题小于O(n^2)的算法是需要更复杂的数据结构才行
了解,因为想给后来的人看问题所在。从回复来看,可能也有人不太清楚问题所在,不过都很感谢大家的回复.
回复

使用道具 举报

🔗
PandasPan 2020-10-9 11:27:28 | 只看该作者
全局:
稍微补充一下,双向队列头尾插入删除可以O1
回复

使用道具 举报

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

本版积分规则

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