摘要:
1,一个整数数列,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对的个数,满足数对中两数的和等于N+1。最直接也最清晰的做法就是排序然后两边往中间同步走,O(nlogn) + O(n)。不过既然相同数值不重复出现,还对空间没啥说的,那就bitmap吧。。。可以做到O(n)。太无聊了,还要揣摩出题人的思路。2,一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。注意:- 5个数值允许是乱序的。比如: 阅读全文
摘要:
老题目了,带有min函数的stack。基本思想是,按照进栈顺序来扫一遍的话,min值并不是一直在变化的,可能连着过了好多个元素,min并没有变。形式化地说,若令f(j) = min(arr[1..j]),那么f(j)的图像由若干条阶跃相连的水平线段组成。因此f(j)可以将每一条线段压缩到一个元素。基本操作是:用两个栈,除了正常的stack之外,附加一个min-stack,保存当前的最小值。数据栈压入元素时,如果小于min-stack最小值,则表明f(j)出现了一个阶跃(从左向右开始了一根新的水平线),要记录下来;否则只压到数据栈即可。数据弹出的时候,检查是不是min-stack的栈顶元素,如果 阅读全文