1、题目
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, return [2]
.
Note:
- Each element in the result must be unique.
- The result can be in any order.
2、Java AC版:
算法思路:
1、使用Set保存结果,因为Set中是不会出现重复元素的!
2、遍历两个数组,当遇到相同元素时,把元素添加到集合中,如果集合中已经有该元素了,则不会重复添加。
3、把Set中的元素保存到int数组中返回
3、Java AC版:public static int[] intersection(int[] nums1, int[] nums2) { Set<Integer> returnVal = new HashSet<Integer>(); int index = 0; for(int i = 0; i < nums1.length; i++){ for(int j = 0; j < nums2.length; j ++){ if(nums2[j] == nums1[i]){ //下面三行代码其实是不需要的,因为Set集合添加元素的时候是会有判断的。 // if(returnVal.contains(nums2[j])){ // continue; // } returnVal.add( nums2[j]); } } } int[] a = new int[returnVal.size()]; for(Integer item:returnVal){ a[index] = item; index++; } return a; }
算法思路:
1、对数组nums1和num2进行排序
2、遍历数组nums1和nums2中元素,并比较对应的元素
1)若相等,则添加元素到集合中(使用int数组保存返回值的需要先判断其值是否与结果中最后保存的元素相等),并把两个索引加1;
2)若不相等,则变化较小元素对应的索引即可。
public static int[] intersection2(int[] nums1, int[] nums2){ // 1、对数组nums1进行排序 //2、遍历数组nums1和nums2中元素,并比较对应的元素 // 若相等,则判断其值是否与结果中最后保存的元素是否相等,相等则直接变化两个索引,否则将该值保存到结果中,并变化两个索引 // 不等,则变化较小元素对应的索引即可。 Arrays.sort(nums1); Arrays.sort(nums2); Set<Integer> returnVal = new HashSet<Integer>(); int index = 0; for(int i =0,j=0;i<nums1.length&j<nums2.length;){ if(nums1[i] == nums2[j]){ returnVal.add(nums1[i]); i++; j++; }else if(nums1[i] <nums2[j]){ i++; }else{ j++; } } int[] result = new int[returnVal.size()]; for(Integer i : returnVal){ result[index] = i; index++; } return result; }
3、Java AC版:
算法思路:
1、使用哈希Set存储两个数组
2、选择Set1遍历,如果Set1的元素在Set2中出现,那么就是交集(与此同时,因为只能返回一个值,所以出现后还需要从Set中删除哦)
public static int[] intersection3(int[] nums1, int[] nums2){ // 1、使用哈希Set存入第一个数组的值 // 2、遍历第二个数组,如果第二个的数在Set中出现,那么就是交集(与此同时,因为只能返回一个值,所以出现后还需要从Set中删除哦) Set<Integer> set1 = new HashSet<Integer>(); Set<Integer> set2 = new HashSet<Integer>(); for(int i = 0;i < nums1.length;i++){ set1.add(nums1[i]); } for(int i = 0;i < nums2.length;i++){ set2.add(nums2[i]); } Set<Integer> returnVal = new HashSet<Integer>(); for(Integer item:set1){ if(set2.contains(item)){ returnVal.add(item); /* 因为两个集合中都没有重复元素,所以其实没必要做删除操作。 但如果数组2中的元素没有用集合保存,则一次添加操作之后必须把该元素从SET1中删除。 */ // set2.remove(item); } } int[] result = new int[returnVal.size()]; int index = 0; for(Integer i : returnVal){ result[index] = i; index++; } return result; }