《剑指offer》笔记-第5章(4)

面试题47:礼物的最大价值

     在一个m*n的期盼的每一格都放有一个礼物,每个礼物具有一定价值(大于0)。从期盼的左上角开始拿礼物,并每次向右或者向下移动一个,直到达到棋盘的右下角。实现一个函数,给定一个棋盘和上面的礼物,计算能最多拿走多大价值的礼物。

测试用例:

     功能测试:多行多列矩阵;一行矩阵;一列矩阵;只有一个数字的矩阵;

     特殊输入:矩阵为null;

分析:

     1.    这是一个动态规划问题,可用递归的思路来分析;f(i,j)代表到达位置(i,j)时最大礼物价值,则f(i,j)=max[f(i-1,j),f(i,j-1)]+gift(i,j);

     2.    用循环代码来实现。维护一个辅助的二维数组maxValues[rows][cols],maxValues[i][j]=max(maxValues[i-1][j],maxValues[i][j-1])+giftValues[i][j]。用二重循环最终得到maxValues[rows-1][cols-1]就是最大的礼物价值。

     3.    ?上述二维数组可以优化为一维数组maxValues[cols]。最大的礼物价值只和(i-1,j)和(I,j-1)有关,数组前j个数字代表f(I,0)到f(I,j-1),数组余下的部分代表f(i-1,j)到f(i-1,cols-1),maxValues[j]=max(maxValues[j],maxValues[j-1])+giftValues[i][j],maxValues[cols-1]是最大的礼物价值;

     4.    考查基于循环的代码避免重复计算;

面试题48:最长不含重复字符的子字符串

     从一个字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串只有‘a’到‘z’的字符。如“arabcacfr”的不含重复字符的最长子字符串是“acfr”,函数返回4。

测试用例:

     功能测试:字符串所有字符都不重复;字符串所有字符都相同;字符串只有一个字符;字符串“arabcacfr”;

     特殊输入:字符串为null;

分析:

     1.    判断一个子字符串是否是包含重复字符需要O(n)时间;一个字符串包含O(n^2)个子字符串;找到所有的子字符串,对每个子字符串进行判断需要O(n^3)的时间;

     2.    看成动态规划问题,用递归的思路分析,令f(i)代表以第i个字符结尾的不包含重复字符的子字符串的最长长度;

     3.    如果第i个字符没有出现过,则f(i)=f(i-1)+1;

     4.    如果第i个字符出现过:如果上一次出现的位置与位置i的距离d大于f(i-1),说明f(i-1)的子字符串中不包含第i个字符,则f(i)=f(i-1)+1;如果上一次出现的位置与位置i的距离d小于等于f(i-1),说明说明f(i-1)的子字符串中包含第i个字符,则f(i)=d;

     5.    代码维护一个maxLength代表最大的距离,因为当前的距离f(i)不一定是最大的;

     6.    代码创建一个长度为26的数组position,存储每个字符上次出现的位置;

5.3时间效率与空间效率的平衡

     “用空间换时间”不一定都可行,要依情况而定,具体问题具体分析;

     多和面试官沟通,显示沟通能力,展示对软件性能的全方位把握;

面试题49:丑数

     丑数是只包含因子2/3/5的数,如6/8是丑数,14不是丑数,1是第一个丑数。实现一个函数,计算出从小到大的顺序第index个丑数。

测试用例:

     功能测试:2、3、4、5等;

     边界测试:0;1;

     性能测试:大整数如1500;

分析:

     1.    从1开始逐个判断是否是丑数,直到第index个丑数;这种方法效率太低;判断一个数是丑数的方法是,连续除以2直到不能被2整除,再连续除以3直到不能被3整除,再连续除以5直到不能被5整除,如果最后整除的结果是1,则是丑数。

     2.    以空间换时间,创建一个大小index的数组,存储从小到大排序的丑数;丑数是另一个丑数乘2/3/5的数,关键问题是如何确保数组里的丑数是排序的;

     3.    假设前n个丑数是排序的,M是最大的丑数,下一个丑数是n个丑数中的一个乘以2或3或5;所有n个丑数(从1开始)乘以2,第一个大于M的丑数保留;所有n个丑数(从1开始)乘以3,第一个大于M的丑数保留;所有n个丑数(从1开始)乘以5,第一个大于M的丑数保留;这三个保留的新的丑数中的最小值是下一个丑数;

     4.    不需要每次从1开始乘以2、3、5,可以维护位置T2(T2之前的丑数乘以2都小于等于N),T3、T5

     5.    Index等于1500时,需要创建1500大小的int数组,空间消耗是1500*4=6000字节=6KB


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值