3.27 首先学到了这么几点吧:
1. 原来是可以定义变长的数组的,就是 int[] a = new int[n];这种形式,n是变量是可以的哈哈哈哈哈哈哈。
2.就是熟练ArrayList 和 HashMap 的用法吧。
3.学会了怎么ArrayList和数组之间的相互转换。
先用了这种普通先排序再比较的方法,果然超时了
public static int[] intersection(int[] nums1, int[] nums2) {
if(nums1 == null || nums2 == null){
return null;
}
Arrays.sort(nums1);
Arrays.sort(nums2);
int n1 = nums1.length-1;
int n2 = nums2.length-1;
//int[] a = new int[0];
//int count = -1;
ArrayList<Integer> list = new ArrayList<Integer>();
while(n1 >= 0 && n2 >= 0){
if(nums1[n1] > nums2[n2]){
n1--;
}
else if(nums1[n1] < nums2[n2]){
n2--;
}
else if(nums1[n1] == nums2[n2]){
if(!(list.contains(nums2[n2]))){
list.add(nums1[n1]);
}
n1--;
n2--;
}
}
int[] a = new int[list.size()];
for( int i=0;i<list.size();i++){
a[i] = (int)list.get(i);
System.out.print(a[i]+ " ");
}
return a;// Write your code here
}
然后 用了两个ArrayList,依旧超时,其实是自己没动脑子,这复杂度依旧是n2. 只是貌似看起来简答了些而已。
public static int[] intersection1(int[] nums1, int[] nums2){
ArrayList<Integer> list = new ArrayList<Integer>();
ArrayList<Integer> list2 = new ArrayList<Integer>();
for(int i = 0; i < nums1.length; i++){
if(!(list.contains(nums1[i]))){
list.add(nums1[i]);
}
}
for(int i = 0; i < nums2.length; i++){
if(list.contains(nums2[i])){
if(!(list2.contains(nums2[i]))){
list2.add(nums2[i]);
}
}
}
int[] a = new int[list2.size()];
for(int j = 0; j < list2.size(); j ++){
a[j] = (int)(list2.get(j));
System.out.print(a[j]+ " ");
}
return a;
}
最后使用hashmap勉强就算过了吧。
有一件特别神奇的事情。如果我把ArrayList 命名为list 就会超时
如果命名为A,就ac了。呵呵呵呵,让我鄙视一下lintcode吧。
public static int[] intersection2(int[] nums1, int[] nums2){
// Write your code here
HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
for(int i =0;i<nums1.length;i++){
if(!map.containsKey(nums1[i])){ // 唯一映射
map.put(nums1[i],1);
}
}
ArrayList<Integer> A = new ArrayList<Integer>();
for(int i=0;i<nums2.length;i++){
if(map.containsKey(nums2[i])){ // 相同元素
A.add(nums2[i]);
map.remove(nums2[i]); // 去除相同元素
}
}
int[] a = new int[A.size()];
for(int i=0;i<A.size();i++){ // 保存到数组中
a[i] = A.get(i);
}
return a;
}