BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #42284同步于 2010/8/10
CPP机器人发帖

[合集] 请教一道算法题

shenlei
2010/8/10镜像同步0 回复
☆─────────────────────────────────────☆ aiwei (天天上上) 于 (Thu Jul 29 13:54:00 2010) 提到: 一个int数列,int a[]={x1,x2,..,xi,..,xn}; 若该数列中每个元素后面小于该元素的元素严格降序,则为符合条件的数列。请问给定一个数列,判断是否为符合条件的数列。 ☆─────────────────────────────────────☆ jmpesp (卡实冻袂条~~ ) 于 (Thu Jul 29 14:09:28 2010) 提到: 【 在 aiwei 的大作中提到: 】 : 一个int数列,int a[]={x1,x2,..,xi,..,xn}; 若该数列中每个元素后面小于该元素的元素严格降序,则为符合条件的数列。请问给定一个数列,判断是否为符合条件的数列。 这个貌似没啥问题吧 时间O(n) 空间O(1) ☆─────────────────────────────────────☆ shenlei (我爱果子|[路]|天山南北|潇湘隐士) 于 (Thu Jul 29 14:11:14 2010) 提到: 1和2比较,2和3比较,3和4比较...有一个不符合整体就不符合了...这个莫非还有别的好算法? ☆─────────────────────────────────────☆ jmpesp (卡实冻袂条~~ ) 于 (Thu Jul 29 14:11:59 2010) 提到: 【 在 shenlei 的大作中提到: 】 : 1和2比较,2和3比较,3和4比较...有一个不符合整体就不符合了...这个莫非还有别的好算法? 不可能了更好的算法了 O(n)是下限 ☆─────────────────────────────────────☆ Wing () 于 (Thu Jul 29 16:26:53 2010) 提到: 【 在 shenlei 的大作中提到: 】 : 1和2比较,2和3比较,3和4比较...有一个不符合整体就不符合了...这个莫非还有别的好算法? : -- : ┌─├──┐┌ ─┐ ┌────┐ 路过 路过也要有道德 : ................... 每个元素后面小于该元素的数严格降序,你这个是整个数列严格降序吧...... ☆─────────────────────────────────────☆ zxsword (YNWA) 于 (Thu Jul 29 16:32:28 2010) 提到: C版人气好强大 Java和算法都有人来问=。= ☆─────────────────────────────────────☆ dyrdyr (bitren@bupt) 于 (Thu Jul 29 18:29:53 2010) 提到: 先判断是不是比该元素小,在比较就可以了 【 在 Wing 的大作中提到: 】 : 每个元素后面小于该元素的数严格降序,你这个是整个数列严格降序吧...... ☆─────────────────────────────────────☆ aiwei (天天上上) 于 (Thu Jul 29 22:22:08 2010) 提到: 咋比较,菜鸟求问。 【 在 dyrdyr 的大作中提到: 】 : 先判断是不是比该元素小,在比较就可以了 ☆─────────────────────────────────────☆ aiwei (天天上上) 于 (Thu Jul 29 22:23:57 2010) 提到: 不是整个数列严格降序,比如4,8,3,2,1。 【 在 Wing 的大作中提到: 】 : 每个元素后面小于该元素的数严格降序,你这个是整个数列严格降序吧...... ☆─────────────────────────────────────☆ Wing () 于 (Fri Jul 30 08:57:30 2010) 提到: 【 在 aiwei 的大作中提到: 】 : 不是整个数列严格降序,比如4,8,3,2,1。 : 【 在 Wing 的大作中提到: 】 : : 每个元素后面小于该元素的数严格降序,你这个是整个数列严格降序吧...... : ................... 我知道,我是说1和2比较,2和3比较,3和4比...这种方法只能判断整个数列降序 ☆─────────────────────────────────────☆ wks (cloverprince) 于 (Fri Jul 30 10:09:13 2010) 提到: 【 在 aiwei 的大作中提到: 】 : 一个int数列,int a[]={x1,x2,..,xi,..,xn}; 若该数列中每个元素后面小于该元素的元素严格降序,则为符合条件的数列。请问给定一个数列,判断是否为符合条件的数列。 : -- 线段树吧。 需要一个结构,保存当前的“不可能区域”。所谓“不可能区域,就是如果下一个的数落在这个区域,整个数列就不符合要求。 如图,每个点表示一个数,横坐标是出现的顺序,纵坐标表示每个数的大小,越高越大。涂色的部分是”不可能区域“。 每次加一个点,需要保证新点不落在当前的”不可能区域“内,而且还会产生新的”不可能区域“,新的”不可能区域“的范围是从当前最大的点,到这个新的点的范围。新的“不可能区域”需要和原有的区域合并。“不可能区域”的总范围只能越来越大。 [upload=1][/upload] ☆─────────────────────────────────────☆ dynamic (dynamic) 于 (Fri Jul 30 11:41:35 2010) 提到: 【 在 aiwei 的大作中提到: 】 : 一个int数列,int a[]={x1,x2,..,xi,..,xn}; 若该数列中每个元素后面小于该元素的元素严格降序,则为符合条件的数列。请问给定一个数列,判断是否为符合条件的数列。 : -- 倒过来比较怎么样,用动态规划的思路,时间O(n),空间O(1)应该能解决吧。 ☆─────────────────────────────────────☆ jackbupt (jackbupt) 于 (Fri Jul 30 13:04:57 2010) 提到: 【 在 aiwei 的大作中提到: 】 : 一个int数列,int a[]={x1,x2,..,xi,..,xn}; 若该数列中每个元素后面小于该元素的元素严格降序,则为符合条件的数列。请问给定一个数列,判断是否为符合条件的数列。 敢问此题是LZ命的吗? 鄙人认为此题不用判断,任何情况都成立。因为条件“每个元素后面小于该元素的元素严格降序”, 既然只是挑小于的数,那么当然严格降序了。 ☆─────────────────────────────────────☆ duvet (蕾丝乳酪) 于 (Fri Jul 30 13:18:02 2010) 提到: 路过,反例:4、1、2、3 【 在 jackbupt 的大作中提到: 】 : 敢问此题是LZ命的吗? 鄙人认为此题不用判断,任何情况都成立。因为条件“每个元素后面小于该元素的元素严格降序”, 既然只是挑小于的数,那么当然严格降序了。 ☆─────────────────────────────────────☆ buptss (buptss) 于 (Fri Jul 30 14:45:38 2010) 提到: <遍历数列中所有元素,对其中每个元素作如下操作 <读入每个元素本身,(O(1))。通过比较,将比它小的所有元素取出,填到一新增数组中O(n) <判断该数组是否严格递减(如是,跳出)O(n)> > 继续遍历> 直到最后一个元素。 这种方法的空间复杂度O(n),时间复杂度O(2n*n) ☆─────────────────────────────────────☆ shunshine (shine) 于 (Fri Jul 30 20:29:21 2010) 提到: 【 在 buptss 的大作中提到: 】 : <遍历数列中所有元素,对其中每个元素作如下操作 : <读入每个元素本身,(O(1))。通过比较,将比它小的所有元素取出,填到一新增数组中O(n) : <判断该数组是否严格递减(如是,跳出)O(n)> : ................... 这个时间复杂度是O(n^2)吧 ☆─────────────────────────────────────☆ Andier (La.is.la.bonita) 于 (Sat Jul 31 04:30:52 2010) 提到: 动态规划靠谱。这样应该可以: upperBound = max(a[1]...a[N]) or a sufficiently large number // O(N) minSeen = max(a[1]...a[N]) or a sufficiently large number // O(N) 从i=N-1向前比较 if a[i]>upperBound 则说明测试失败。整个序列不符合要求,return false else if a[i]<=a[i+1] upperBound = min(a[i+1],upperBound, mininum) // 再往前的数不能小于a[i+1] minimum = a[i]; else if a[i]>a[i+1] // do nothing 一直到了第一个元素还没问题,Return true. 时间O(N), 空间O(1) upperbound是从后向前数,出现的所有上升序列中,第二小的数,而不是最小那个。因为如果再往前有大于最小,但小于第二小的数,并没有关系。 minSeen 是所有见过数中最小的。如果a[i]<a[i+1]的时候,上界应该等于a[i+1]和minSeen里面比较小的那个。这样才能确保它(算上a[i])是第二小的。 修改了一下,还是觉得有点纠结。欢迎大家拍砖。。 p.s. 多谢wks的回复。 ☆─────────────────────────────────────☆ richlm (银剑山庄) 于 (Sun Aug 1 11:22:24 2010) 提到: 不错的扫描算法。 【 在 Andier 的大作中提到: 】 : 动态规划靠谱。这样应该可以: : upperBound = max(a[1]...a[N]) or a sufficiently large number // O(N) : 从i=N-1向前比较 : ................... ☆─────────────────────────────────────☆ RaulSpain007 (Raul) 于 (Mon Aug 2 10:44:31 2010) 提到: 【 在 jmpesp 的大作中提到: 】 : 不可能了更好的算法了 O(n)是下限 如果是判断整个数列为严格递减还真有...用分治的思想 应该可以降到logn ☆─────────────────────────────────────☆ wks (cloverprince) 于 (Mon Aug 2 11:29:08 2010) 提到: 【 在 Andier 的大作中提到: 】 : 动态规划靠谱。这样应该可以: : upperBound = max(a[1]...a[N]) or a sufficiently large number // O(N) : 从i=N-1向前比较 : ................... 反例:6,3,7,5,9 开始: upperBound = 9 对于5: 5<=9, upperBound = min(9,upperBound) = 9 对于7: 7>9, do nothing 对于3: 3<=7, upperBound = min(7, upperBound) = 7 对于6: 6>3, do nothing 结果:接受6,3,7,5,9 但是,6后面有3,5。不符合要求。 ☆─────────────────────────────────────☆ jmpesp (卡实冻袂条~~ ) 于 (Mon Aug 2 11:31:10 2010) 提到: 【 在 wks 的大作中提到: 】 : 反例:6,3,7,5,9 : 开始: : upperBound = 9 : ................... zz 每次wks回帖 我就能學到一點什麽 ☆─────────────────────────────────────☆ wks (cloverprince) 于 (Mon Aug 2 13:54:25 2010) 提到: 其实谁回帖你都能学到点什么 【 在 jmpesp 的大作中提到: 】 : : 【 在 wks 的大作中提到: 】 : : 反例:6,3,7,5,9 : ................... ☆─────────────────────────────────────☆ gootyking (『热情一顶乐团』团长|回帖终结者A1) 于 (Mon Aug 2 13:58:14 2010) 提到: 除了我。。。呃。, 【 在 wks (cloverprince) 的大作中提到: 】 : 其实谁回帖你都能学到点什么 ☆─────────────────────────────────────☆ SuK (木有~) 于 (Mon Aug 2 14:33:57 2010) 提到: 想了2分钟,不一定好用哈,只是提供一种思路:反过来呢,从最后一个数开始,往前找,对于每一个数,如果前面有数大于他,设has_bigger=1,如果有数小于他,设has_smaller=1,如果遍历完整个数列不满足 has_bigger && has_smaller,那么对前一个数开始遍历,否则return false。当所有的数遍历完了,就return true。 ☆─────────────────────────────────────☆ Andier (La.is.la.bonita) 于 (Tue Aug 3 10:02:44 2010) 提到: 【 在 wks 的大作中提到: 】 : 反例:6,3,7,5,9 : 开始: : upperBound = 9 : ................... 多谢。修改了一下。我觉得ok了,你再看看:) ☆─────────────────────────────────────☆ xiecaiji (wbc粉丝团----饼干---谁说装不像) 于 (Tue Aug 3 10:50:02 2010) 提到: 【 在 SuK 的大作中提到: 】 : 想了2分钟,不一定好用哈,只是提供一种思路:反过来呢,从最后一个数开始,往前找,对于每一个数,如果前面有数大于他,设has_bigger=1,如果有数小于他,设has_smaller=1,如果遍历完整个数列不满足 has_bigger && has_smaller,那么对前一个数开始遍历,否则return false。当所有的数遍历完了,就return true。 : -- o(n2)了
订阅后,新回复会通过你的通知中心匿名送达。
0 条回复
暂无回复 · 你可以订阅本帖等待新回复。