几个精妙的小问题(By Divide and Conquer)

所谓分治法就是分而治之的意思,即将一个不易解决的大问题分解为几个易于解决的小问题,然后再将各个小问题的解合并起来就是大问题的解。这种方法虽然简单,但是对于很多问题都很有效,下面试举几例:

 


问题一:有效字符串个数问题

能在信道上传递的字符串满足如下两条性质:该字符串中只包含'a'、'b'、'c'三种字符;如果"aa"存在该字符串中,则该字符串无法传递,视为无效。例如:长度为2的有效字符串有8个:"ab"、"ac"、"ba"、"bb"、"bc"、"ca"、"cc"、"cb"。现在要你求出长度为n的有效字符串有多少个?

    提示:f(n)=2f(n-1)+2f(n-2), n>2; f(1)=3;f(2)=8

 

 
问题二:计算一个序列中倒置的个数

先来介绍一下倒置的概念:对一个序列a1,a2,a3,...,an来说,倒置为:i<j,ai>aj。现在要求在尽量短的时间下求出一个n个元素的序列中有多少倒置?

    提示:可以在O(nlgn)时间复杂度下实现。

 

 

问题三:找两个数

A和B是两个分别含有n个正整数的序列。对一个给定的正整数x,设计一个复杂度尽量低的算法找出是否存在x=a+b,其中a∈A,b∈B?

    提示:可以在O(nlgn)时间复杂度下实现。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值