摘要:
这个也写过,见最大子矩阵和。 阅读全文
摘要:
这个以前写过,见求数组的最长子数组之和的最大值这里说一下后面扩展题目。1. 简述 1) 如果数组首尾相连,即允许找到一组数字(A[i],···,A[n-1], A[0],···, A[j]),请使其和最大,怎么办? 2) 如果题目要求返回最大子数组的位置,算法应该如何改变?还能保持O(N)的复杂度么?2. 思路 第一个问题,书上给出了解答,即分为首尾相连和首尾不连两种情况,对于首尾不连的情况,按照前面的思路就可以了,对于首尾相连的情况,那么必然包含A[N-1]与A[0],然后从A[0]向后找最大的一段(按照不连的方法),从A[N-1] 阅读全文
摘要:
1. 简述 给定一个长度为N的整数数组,只允许用乘法,不能够用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法时间复杂度。2. 思路 题目中要求不能用除法,实际上就是否定了将所有数乘起来,然后分别去除每个数字的方法,实际上这种方法也不好实现,因为如果数字中有0的话,都乘起来就是0,还要除0,麻烦啊,另外,数值溢出也是个麻烦。实际上只要找到N-1个数的组合即可,并不需要去计算这N-1个数字的乘积。 方法就是首先,统计正数,负数,0的个数,以及最大正数的下标,最小正数的下标,最大负数的下标,最小负数的下标,任意一个0的下标。然后分情况讨论:· 如果0的个数大于1,那么N-1 阅读全文
摘要:
1. 简述 能否快速找出一个数组中的两个数字,让这两个数字之和等于一个给定的值,为了简化起见,我们假设这个数组中肯定存在至少一组符合要求的解。2. 思路 方法一:遍历数组中任意两个数字,C(N,2)种组合,复杂度O(N^2)。 方法二:首先排序数组,然后遍历其中每个数字,二分查找找另一个符合条件的数字(即给定值减去遍历的当前数字),复杂度O(LogN + N*LogN),注意这个二分查找要忽略当前遍历的那个数字,注意修改二分查找的代码。另外计数排序或者哈希表也不错,这就不用排序了,复杂度可以到达O(N),另外需要空间复杂度至少为O(N)。 方法三:首先排序数组,假设先序排序,然后两边走,如果刚 阅读全文