tips:
1 两次循环
2 arrays.sort
3 hashSet set
类比Arraylist 数组
set.contains(i)
set.add
list.get(idx)
题目
给定两个数组,写一个方法来计算它们的交集。
例如:
给定 nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
注意:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
分析
1 对于这种相同的元素取出来的用 arraylist
对于相同元素只取出来一次的用 hashset
思路都可以用 双指针的方式
1 先排序
2 双指针走,相同的话,都提前,否则根据情况走i 走j
代码
不重复
public int[] intersection(int[] nums1, int[] nums2) {
HashSet<Integer> set = new HashSet<Integer>();
Arrays.sort(nums2);
for(int i : nums1){
if(binarysearch(nums2, i)){
set.add(i);
}
}
int[] array = new int[set.size()];
int k = 0;
for(Integer i : set){
array[k++] = i;
}
return array;
}
public boolean binarysearch(int[] array, int k){
int i = 0;
int j = array.length - 1;
boolean b = false;
while (i <= j){
int mid = i + (j - i)/2;
if(array[mid] > k){
j = mid - 1;
}else if(array[mid] < k){
i = mid + 1;
}else{
return true;
}
}
return b;
}
重复 双指针法 比较好理解
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
ArrayList<Integer> list = new ArrayList<Integer>();
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0, j = 0;
while (i < nums1.length && j < nums2.length){
if(nums1[i] > nums2[j]){
j++;
}else if(nums1[i] < nums2[j]){
i++;
}else{
list.add(nums1[i]);
i++;
j++;
}
}
int[] result = new int[list.size()];
int idx = 0;
for(Integer k : list){
result[idx++] = k;
}
return result;
}
}
用hashmap的解法
1 hashmap<k, v> map
2 map.containkey(key)
map.get(key) 取到val值;类似的arraylist 也有get方法
public int[] intersect(int[] nums1, int[] nums2){
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], map.get(nums1) + 1);
else map.put(nums1[i], 1);
}
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < nums2.length; i++) {
if(map.containsKey(nums2[i])) list.add(nums2[i]); map.put(nums2[i], map.get(nums2[i]) - 1);
}
int[] result = new int[list.size()];
int idx = 0;
for(Integer k : list){
result[idx++] = k;
}
return result;
}