编程环境:c++
1、搭积木
描述
小明有一袋子长方形的积木,如果一个积木A的长和宽都不大于另外一个积木B的长和宽,则积木A可以搭在积木B的上面。好奇的小明特别想知道这一袋子积木最多可以搭多少层,你能帮他想想办法吗?
定义每一个长方形的长 L 和宽 W ,袋子里面长方形的个数为 n 。
假如袋子里共有5个积木分别为 (2, 2), (2, 4), (3, 3), (2, 5), (4, 5), 则不难判断这些积木最多可以搭成4层, 因为(2, 2) < (2, 4) < (2, 5) < (4, 5)。
算法思想:
题目要求积木上层的长宽都要小于下层,求最长的层数。首先我们按照长度优先对所有的长方形积木升序排列,然后再遍历获取到排序后所有的宽,得到一个新的数组。因为题目要求的时间比较极限,所以这里选择时间复杂度最优的二分法进行排序,得到一个宽升序的优先级子序列,打印输出子序列大小即为最长的层数。
代码部分实现:
二分,len为子序列长度
2、怪数
描述:
小M突然对怪数产生了兴趣。假设一个数n,如果[n/1]+[n/2]+...+[n/k](k为趋近于正无穷的正整数)为一个偶数,那么这个数是一个怪数,现在给定一个区间[a,b],求[a,b]之间有多少怪数。
[x]表示不大于x的最大整数。
算法思想:
用数学思路解决问题:根据100以内穷举的怪数数据不难发现,,每行中当i为偶数时,位于区间[i2,(i+1)2)]内数全为满足要求的怪数。所以根据题目给出的范围ab,首先遍历到最小的i满足i^2>=a,对ab中间的数进行判断,当i-1为偶数时,将范围内的怪数加上;否则,i++向后延申,直到i^2超出b范围。再进行最后一次判断后,将最终结果打印输出即可。
代码部分实现:
3、连续子数组最大和
描述
输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。
算法思想:舍弃之前和<0的部分和,求得遍历完成后的最大子数组和。
部分代码实现: