锁定老帖子 主题:一道算法面试题
精华帖 (0) :: 良好帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-03-16
e_man 写道 我的思路是开一个长度为n的数组x。遍历第一个1000W个元素的数组a,对于每一个值a[i],置x中相应的位为1,即x[a[i]]=1。再遍历第二个1000W个元素的数组b,对于每一个值b[i],判断x[b[i]]是否为1,为1则该值属于交集。
至于开多少长度的数组,若题目中指定元素为整数,则n=Integer.MAX_VALUE,若元素为长整数,则n=Long.MAX_VALUE,若不知道范围,ok,遍历一遍x取最大值呗。 最后的时间复杂度都是O(n). 不知道各位TX有没有更好的解题思路~ 兄弟这样要开4G内存, 不好吧 |
|
返回顶楼 | |
发表时间:2010-03-16
最后修改:2010-03-16
用hash或是bit map都可以。java里可以直接使用BitSet类,或自己实现一个类似BitSet的位图结构:
import java.util.*; public class Intersect { public static int[] getIntersect(int[] list1, int[] list2) { BitSet bs = new BitSet(); Set<Integer> set = new HashSet<Integer>(); for (int i = 0; i < list1.length; i++) bs.set(list1[i]); for (int i = 0; i < list2.length; i++) if (bs.get(list2[i])) set.add(list2[i]); int[] ret = new int[set.size()]; int count = 0; for (Iterator<Integer> it = set.iterator(); it.hasNext();) ret[count++] = it.next(); return ret; } public static void main(String[] args) { int[] list1 = { 1, 3, 5, 7, 9, 13, 18, 20, 300 }; int[] list2 = { 2, 3, 6, 7, 10, 11, 18, 21, 3, 300 }; int[] list3 = getIntersect(list1, list2); System.out.println(Arrays.toString(list3)); } } 运行结果: ========= [18, 3, 7, 300] 没有考虑内存问题。 |
|
返回顶楼 | |
发表时间:2010-03-16
e_man 写道 我的思路是开一个长度为n的数组x。遍历第一个1000W个元素的数组a,对于每一个值a[i],置x中相应的位为1,即x[a[i]]=1。再遍历第二个1000W个元素的数组b,对于每一个值b[i],判断x[b[i]]是否为1,为1则该值属于交集。
至于开多少长度的数组,若题目中指定元素为整数,则n=Integer.MAX_VALUE,若元素为长整数,则n=Long.MAX_VALUE,若不知道范围,ok,遍历一遍x取最大值呗。 最后的时间复杂度都是O(n). 不知道各位TX有没有更好的解题思路~ “长度为n的数组x”——销毁的物理内存很多,浪费空间,算是一种最浪费物理内存的方法。 |
|
返回顶楼 | |
发表时间:2010-03-16
整数的话:先把两个数组排序,遍历一个数组去另一个数组用二分查找法查询···
|
|
返回顶楼 | |
发表时间:2010-03-16
leon_a 写道 对第一个1000W数组hash,生成一个hash化数组。对第二个1000W数组采取同样算法hash,得到下标i,取hash[i]是否为null,不为null则是交集。剩余的问题是如何解决hash冲突
正解,Hash加计数的方式就可以啦~~ |
|
返回顶楼 | |
发表时间:2010-03-16
leon_a 的方法不懂...
xserver 写道 整数的话,排序后比较好不好啊
排序包含太多次遍历,能保证int以内的话,感觉e_man的方法挺好,long就不一样了 |
|
返回顶楼 | |
发表时间:2010-03-16
dingyaodanv1 写道 整数的话:先把两个数组排序,遍历一个数组去另一个数组用二分查找法查询···
....排序的话,排序完只需要同时遍历就行了 |
|
返回顶楼 | |
发表时间:2010-03-16
e_man 写道 我的思路是开一个长度为n的数组x。遍历第一个1000W个元素的数组a,对于每一个值a[i],置x中相应的位为1,即x[a[i]]=1。再遍历第二个1000W个元素的数组b,对于每一个值b[i],判断x[b[i]]是否为1,为1则该值属于交集。
至于开多少长度的数组,若题目中指定元素为整数,则n=Integer.MAX_VALUE,若元素为长整数,则n=Long.MAX_VALUE,若不知道范围,ok,遍历一遍x取最大值呗。 最后的时间复杂度都是O(n). 不知道各位TX有没有更好的解题思路~ 正解! |
|
返回顶楼 | |
发表时间:2010-03-16
强强爱妍妍 写道 e_man 写道 我的思路是开一个长度为n的数组x。遍历第一个1000W个元素的数组a,对于每一个值a[i],置x中相应的位为1,即x[a[i]]=1。再遍历第二个1000W个元素的数组b,对于每一个值b[i],判断x[b[i]]是否为1,为1则该值属于交集。
至于开多少长度的数组,若题目中指定元素为整数,则n=Integer.MAX_VALUE,若元素为长整数,则n=Long.MAX_VALUE,若不知道范围,ok,遍历一遍x取最大值呗。 最后的时间复杂度都是O(n). 不知道各位TX有没有更好的解题思路~ 兄弟这样要开4G内存, 不好吧 兄弟你的4G内存如何得出来的? 我以INT型来算大约是40M。。。 |
|
返回顶楼 | |
发表时间:2010-03-16
引用 对第一个1000W数组hash,生成一个hash化数组。对第二个1000W数组采取同样算法hash,得到下标i,取hash[i]是否为null,不为null则是交集。剩余的问题是如何解决hash冲突
赞成这样做 |
|
返回顶楼 | |