##2.141
给定一个含有n个元素的数组,注意到数组中的某些元素是重复的,即这些元素在数组中出现不止一次。给出一种算法,以O(nlogn)时间移除掉数组中的所有重复元素。
###思路1:1
先采用nlogn级别的排序算法,再线性扫描,得到结果。
1 | package homework_chen; |
###思路2:1
2
3线性下找到数组的最大值,最小值,若相差距离可以接受,则此方法效率不错。然后建立hash数组,扫描r数组,若flag位置的值为false,则改为true,否则不变,最后再顺序扫描一遍hash数组,输出结果。
此方法为O(n)线性级别,不符合题目的要求,但优于题目的要求。
但适用条件为密集数组,若前后跨距太大,则得不偿失
1 | package homework_chen; |
##2.161
给定一个无穷数组A[·],其中前N个元素都是整数,且已排好序,剩余元素均为∞。n的值未知.给出一个算法,以一个整数x为输入,以O(logn)时间找到数组中的一个位置,并满足其上的元素为x.
###思路:
从a[1]开始,依次访问a[2],a[4],a[8],依次类推,访问至a[$2^i$],发现a[$2^i$2]为∞,这个花费的时间代价为O(logn)
设k小于i+1, x必定在a[$2^k$]至a[$2^k$2]之间
对这个区间进行二分搜索,定位即可,若搜索到,返回位置,若搜索不到,返回-1.
1 | package homework_chen; |
##2.231
如果一个数组A[1,...,n]中总数超过半数的元素都相同时,该数组被称为含有一个主元素,给定一个数组,设计一个有效算法,确定该数组中是否含有一个主元素,如果有,找出这个元素。需注意的是,该数组的元素之间可能不存在顺序——即不能进行”A[i]<A[j]”的判断,但是可以进行是否相等的判断。
###思路:1
2
3
4
5整体采用分治法
当分到只有一个元素时,必定是主元素
对于连续的两段,取得左半边的主元素,取得右半边的主元素
如果左右两边一样,必定为主元素
否则线性扫描,统计次数,找到主元素,若没有返回null
1 | package homework_chen; |