摘要: 编程之美2.16 最长递增子序列:写一个时间复杂度尽可能低的程序,求一个一维数组(N个元素)中的最长递增子序列的长度。例如:在序列1,-1,2,-3,4,-5,6-7中,其最长的递增子序列为1,2,4,6分析:利用动态规划分析。用A[i]来更新maxLen和MaxV:,从A[0]~A[i-1]可能存在多个存在多个子问题的最优解,所以需要将他他们合并为一个。1. 当A[i]>MaxV[maxLen](即子问题最优解的最小值)时,maxLen++ && MaxV[maxLen] = a[i] A[i]>MaxV[maxLen]时,A[i]必然比MaxV[0]-MaxV[ 阅读全文
posted @ 2013-12-19 16:49 higirle 阅读(399) 评论(0) 推荐(0) 编辑
摘要: 对于很多精妙的题目,常常在想这些出题的童鞋是怎么想到的,因为这些题目确实能够很深入的考察出一个面试者的逻辑,算法和思维功底。本文章主要是总结自己在做这些面试题和了解相应解法的过程中思考的一些东西,感觉这些东西在很多题目中都出现过,非常值得抽象出来专门理解。 一 双指针遍历 所谓双指针,是利用两个指针对一个有序数组进行遍历,查找出符合要求的数据集合。相信大家都接触到了这种思维模式的解题方法,只是没有注意到罢了。下面举几个例子吧。 例1:给定一个数组a[n],求数组中是否存在两个数的和等于给定值sum并输出?编程之美 2.12 快速寻找满足条件的两个数 这个问题很常见,我当年在面试微软实习... 阅读全文
posted @ 2013-12-19 12:55 higirle 阅读(3472) 评论(0) 推荐(1) 编辑
摘要: 问题一:一个有N个整数元素的一维数组(A[0],A[1]....,A[n-2],A[n-1]),求子数组之和的最大值是什么?方法一:动态规划问题描述符合动态规划最优子结构的要求。设b[i]表示以a[i]结尾 的子数组的最大子段和(a[i]一定包含在b[i]中,即:b[i]=max{sum(a[j~i])},其中0Max{sum, Max{a[i], b[i-1]+a[i]}}1. 包含a[i],即求b[i]的最大值,在计算b[i]时,可以考虑以下两种情况,因为a[i]要求一定包含在内,所以 1) 当b[i-1]>0,b[i] = b[i-1]+a[i] 2) 当b[i-1]sum ,即b 阅读全文
posted @ 2013-12-19 12:43 higirle 阅读(1089) 评论(0) 推荐(0) 编辑