题目
1:返回的数组中不能包含重复值
2.必须将所有数字列出来,包括重复的数字
大致思路
第一题的思路:使用set来实现,第一个set存放第一个数组中出现的值,第二个set遍历之前先判断第二个数组的数字是否包含在第一个set中,如果包含,则直接将其添加到第二个set中,最后将set中的值赋值到新的数组中即可返回。由于set的特性,不会包含重复。也就是题一。
第二题的思路:两个数组进行排序,再进行遍历,比较即可得到重复的值,没什么思路上的问题,比第一个简单一点。本组代码未放入eclipse测试,但是leetcode是提交通过的。
代码实现
//第一题:两个数组的交集Ⅰ
package com.immunize.leetcode.intersect;
import java.util.HashSet;
/**
* 两个数组的交集1:找到两个数组的相同值,并返回新数组,但是其中的值是唯一的。
*
* @author Mr IMMUNIZE
*
*/
public class FindTheSame {
public int[] intersect(int[] nums1, int[] nums2) {
HashSet<Integer> record = new HashSet();
HashSet<Integer> result = new HashSet();
for (int num : nums1) {
record.add(num);
}
for (int num : nums2) {
if (record.contains(num)) {
result.add(num);
record.remove(num);
}
}
int index = 0;
int[] resultSet = new int[result.size()];
for (int i : result) {
resultSet[index++] = i;
}
return resultSet;
}
}
package com.immunize.leetcode.intersect;
/**
* 测试:寻找两个数组中的相同值,并返回新的数组
*
* @author Mr IMMUNIZE
*
*/
public class FindSameTest {
public static void main(String[] args) {
FindTheSame fs = new FindTheSame();
int[] nums1 = { 1, 2, 2, 1 };
int[] nums2 = { 2, 2 };
int[] resultSet = fs.intersect(nums1, nums2);
for (int num : resultSet) {
System.out.print(num + " ");
}
}
}
-------------------------------------------------------------------------------
//第二题:两个数组的交集Ⅱ
public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
Arrays.sort(nums1);//底层使用了快排,O(nlogn)
Arrays.sort(nums2);
List<Integer> list=new ArrayList<Integer>();
for(int i=0,j=0;i<nums1.length&&j<nums2.length;){
if(nums1[i]==nums2[j]){
list.add(nums1[i]);
i++;
j++;
}
else if(nums1[i]>nums2[j]){
j++;
}else{
i++;
}
}
int[]res=new int[list.size()];
for(int i=0;i<res.length;i++){
res[i]=list.get(i);
}
return res;
}
}