文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。
相关文章:
文章目录:
题目描述:
java实现方法1:
python实现1:
java实现方法2:
python实现方式2:
java实现方式3:
python的实现方式3:
java实现方式4:
源码地址:
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
示例 2:
输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
说明:
输出结果中的每个元素一定是唯一的,我们可以不考虑输出结果的顺序。
来源:力扣(LeetCode)
先对属两个数组进行排序,然后将两个数组中相同元素存储到set集合中,最后把set集合转成数组
private int[] intersection2(int[] nums1, int[] nums2) {
Set set = new HashSet<>();
Arrays.sort(nums1);
Arrays.sort(nums2);
int i = 0;
int j = 0;
while (i < nums1.length && j < nums2.length) {
if (nums1[i] < nums2[j]) {
i++;
continue;
}
if (nums1[i] > nums2[j]) {
j++;
continue;
}
set.add(nums1[i]);
i++;
j++;
}
return set.stream().mapToInt(Number::intValue).toArray();
}
时间复杂度为:O(n)
空间复杂度为:O(n)
# encoding='utf-8'
'''
author:zhangyu
date:2019.8.4
description:找到两个数组中的交集
'''
def get_intersection(arr1, arr2):
arr1.sort();
arr2.sort();
arr = []
i = 0
j = 0
while i < len(arr1) and j < len(arr2):
if arr1[i] < arr2[j]:
i += 1
elif arr1[i] > arr2[j]:
j += 1
else:
arr.append(arr1[i])
i += 1
j += 1
return arr
if __name__ == '__main__':
arr1 = [1, 2, 3, 1]
arr2 = [2, 3, 4, 2]
arr = get_intersection(arr1, arr2)
print(arr)
时间复杂度为:O(n)
空间复杂度为:O(n)
利用list链表来存储相交的元素,set集合去除重复的元素,最后把list链表转换为int数组
private int[] intersection3(int[] nums1, int[] nums2) {
if(nums1.length<1||nums2.length<1||nums1==null||nums2==null){
return new int[0];
}
Set set=new HashSet<>();
for(int num1:nums1){
set.add(num1);
}
List list=new ArrayList<>();
for(int num2:nums2){
if(set.contains(num2)){
list.add(num2);
set.remove(num2);
}
}
return list.stream().mapToInt(Integer::valueOf).toArray();
}
时间复杂度为:O(n)
空间复杂度为:O(n)
# encoding='utf-8'
'''
author:zhangyu
date:2019.8.4
description:找到两个数组中的交集
'''
def get_intersection(arr1, arr2):
s = set()
for ele in arr1:
s.add(ele)
arr = []
for ele in arr2:
if s.__contains__(ele):
arr.append(ele)
s.remove(ele)
return arr
if __name__ == '__main__':
arr1 = [1, 2, 3, 1]
arr2 = [2, 3, 4, 2]
arr = get_intersection(arr1, arr2)
print(arr)
时间复杂度为:O(n)
空间复杂度为:O(n)
利用两个set集合进行计算,最后将相同元素保存到数组, 然后再截取相同的数组
private int[] intersection(int[] nums1, int[] nums2) {
Set set1 = new HashSet();
for (int ele : nums1) {
set1.add(ele);
}
Set set2 = new HashSet();
for (int ele : nums2) {
set2.add(ele);
}
int count = 0;
int[] newArr = new int[set1.size()];
for (int e : set1) {
if (set2.contains(e)) {
newArr[count++] = e;
}
}
return Arrays.copyOfRange(newArr, 0, count);
}
时间复杂度为:O(n)
空间复杂度为:O(n)
# encoding='utf-8'
'''
author:zhangyu
date:2019.8.4
description:找到两个数组中的交集
'''
def get_intersection(arr1, arr2):
arr = []
s1 = set()
for ele in arr1:
s1.add(ele)
s2 = set()
for ele in arr2:
s2.add(ele)
for ele in s1:
if s2.__contains__(ele):
arr.append(ele)
return arr
if __name__ == '__main__':
arr1 = [1, 2, 3, 1]
arr2 = [2, 3, 4, 2]
arr = get_intersection(arr1, arr2)
print(arr)
时间复杂度为:O(n)
空间复杂度为:O(n)
利用flag进行判断,将一个数组设置true,再利用另外一个数组进行匹配:
private int[] intersection4(int[] nums1, int[] nums2) {
int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;
for (int num1 : nums1) {
if (num1 > max) {
max = num1;
}
if (num1 < min) {
min = num1;
}
}
boolean[] arr = new boolean[max - min + 1];
for (int num1 : nums1) {
arr[num1 - min] = true;
}
// 判断数组 nums2 中的数是否在数组 nums1 中存在,
// 如果存在保存在数组 tmp 中
int[] tmp = new int[max - min + 1];
int idx = 0;
for (int num2 : nums2) {
if (num2 >= min && num2 <= max && arr[num2 - min]) {
tmp[idx++] = num2;
arr[num2- min] = false;
}
}
// 返回结果
int[] ret = new int[idx];
for (int i = 0; i < idx; i++) {
ret[i] = tmp[i];
}
return ret;
}
时间复杂度:O(n)
空间复杂度:O(n)
https://github.com/zhangyu345293721/leetcode