方法一:
思路:
用flag标记是否nums2中的该元素已经是相交的元素,若不是才加入结果list,并置flag为1然后跳出内层循环继续判断nums1的下一个元素。
public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
int len = Math.min(len1, len2);
int[] flag = new int[len2];
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < len1; i++) {
for (int j = 0; j < len2; j++) {
if (nums1[i] == nums2[j] && flag[j] == 0) {
list.add(nums2[j]);
flag[j] = 1;
break;
}
}
}
int size = list.size();
int[] result = new int[size];
for (int i = 0; i < size; i++)
result[i] = list.get(i);
return result;
}
}
Runtime:12ms
方法二:
思路:
将给定的数组排序;
i索引nums1,j索引nums2,直到某一数组遍历完毕;
若当前元素值nums1大于nums2,则j后移;若nums1小于nums2,则i后移;否则i、j都后移。
public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
int[] result = new int[Math.min(len1, len2)];
int len = 0, i = 0, j = 0;
Arrays.sort(nums1);
Arrays.sort(nums2);
while (i < len1 && j < len2) {
if (nums1[i] == nums2[j]) {
result[len] =nums1[i];
len++;
i++;
j++;
}
else if (nums1[i] < nums2[j])
i++;
else
j++;
}
result = Arrays.copyOf(result, len);
return result;
}
}
Runtime:4ms
方法三:
思路:
对nums1进行Map,查找nums2元素是否在Map中。
public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
int[] result = new int[Math.min(len1, len2)];
int j = 0;
Map<Integer, Integer>map = new HashMap<Integer, Integer>();
for (int i = 0; i < len1; i++) {
if (map.containsKey(nums1[i]))
map.put(nums1[i], map.get(nums1[i]) + 1);
else
map.put(nums1[i], 1);
}
for (int i = 0; i < len2; i++) {
if (map.containsKey(nums2[i]) && map.get(nums2[i]) > 0) {
result[j] = nums2[i];
j++;
map.put(nums2[i], map.get(nums2[i]) - 1);
}
}
result = Arrays.copyOf(result, j);
return result;
}
}
Runtime:7ms