其中第三题可以扩展一下,如果4张卡中不能有重复的,如何求解?
卡牌那题突然开窍了二分查找的左闭右开写法,之前二分查找的时候我习惯于使用“左闭右闭\([l, r]\)”的写法:
int left = 0, right = n-1; while(left <= right) { int m = (left + right) >> 1; if(x < a[m]) { right = m - 1; } else if(x > a[m]) { left = m + 1; } else { break; } }
这么写貌似没什么不妥,而且也很直观容易理解,可能我短时间内做题还是会这么写;但是这次我仿佛领悟到了“左闭右开\([l, r)\)”的优雅之处:
bool binary_search(int x) { int l = 0, r = n; // 注意r这个下标实际上不属于区间内 while(r - l >= 1) { // 区间不为空 int i = (l + r) / 2; // 因为 (l + l) / 2 = l,(r + r) / 2 = r,又因为l < r,即((r-1) + r) / 2 = (r-1),所以(l + r) / 2 属于[l, r - 1],一定是一个有效的下标 if(k[i] == x) return true; else if(k[i] < x) l = i + 1; else r = i; // 再次强调r不属于区间内,因此当前这个i实际上是被排除在外的 } return false }
关于复杂度,书中同样避开了太过数学的解释(是的,我刚从《具体数学》的阴影中走出来),简单来讲,复杂度是:
用来描述算法的运行时间的,与数据规模有关的的数学表达式
将数据规模代入复杂度表达式,可以计算出来一个操作次数,在1s时间限制下,操作次数:
跟以往认知是类似的,不过以前直接用\(1e8\)去计算了,看来这个上界还是不安全的
如果给的时间>1s,可以乘上相应的系数
由于第一章没有习题,所以内容就这么多,后续再继续更新
为啥不支持彩色字体啊?。。。