使用kotlin完成这个题目:349. 两个数组的交集 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 解释:[4,9] 也是可通过的 提示: 1 <= nums1.length, nums2.length <= 1000 0 <= nums1[i], nums2[i] <= 1000
时间: 2023-07-02 07:19:54 浏览: 82
以下是使用 Kotlin 实现求两个数组的交集的代码:
```kotlin
fun intersection(nums1: IntArray, nums2: IntArray): IntArray {
val set1 = nums1.toSet()
val set2 = nums2.toSet()
return (set1 intersect set2).toIntArray()
}
```
这段代码中,我们首先将 `nums1` 和 `nums2` 转换为 `Set` 集合,然后使用 `intersect` 函数求两个集合的交集。最后,将交集转换为数组并返回即可。
这样,我们就完成了求两个数组的交集的实现。在上述示例中,我们可以调用 `intersection(intArrayOf(1, 2, 2, 1), intArrayOf(2, 2))`,得到 `[2]`。再调用 `intersection(intArrayOf(4, 9, 5), intArrayOf(9, 4, 9, 8, 4))`,得到 `[9, 4]`。
相关问题
使用kotlin解决这个问题:4. 寻找两个正序数组的中位数 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。 算法的时间复杂度应该为 O(log (m+n)) 。 示例 1: 输入:nums1 = [1,3], nums2 = [2] 输出:2.00000 解释:合并数组 = [1,2,3] ,中位数 2 示例 2: 输入:nums1 = [1,2], nums2 = [3,4] 输出:2.50000 解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5 提示: nums1.length == m nums2.length == n 0 <= m <= 1000 0 <= n <= 1000 1 <= m + n <= 2000 -106 <= nums1[i], nums2[i] <= 106 通过次数953,035提交次数2,296,023
这个问题可以使用二分查找的方法来解决。由于两个数组都是有序的,我们可以考虑将它们合并成一个有序数组,然后找到其中位数。
具体实现:
1. 如果一个数组为空,则中位数为另一个数组的中间值。
2. 如果两个数组的长度相加为奇数,则中位数为合并后数组的中间值。
3. 如果两个数组的长度相加为偶数,则中位数为合并后数组中中间两个数的平均值。
4. 使用二分查找的方法找到合并后数组中的中位数。
下面是 Kotlin 代码实现:
```kotlin
fun findMedianSortedArrays(nums1: IntArray, nums2: IntArray): Double {
if (nums1.size > nums2.size) {
return findMedianSortedArrays(nums2, nums1)
}
val m = nums1.size
val n = nums2.size
var left = 0
var right = m
while (left <= right) {
val i = (left + right) / 2
val j = (m + n + 1) / 2 - i
val maxLeft = if (i == 0) Int.MIN_VALUE else nums1[i - 1]
val minRight = if (i == m) Int.MAX_VALUE else nums1[i]
val maxLeft2 = if (j == 0) Int.MIN_VALUE else nums2[j - 1]
val minRight2 = if (j == n) Int.MAX_VALUE else nums2[j]
if (maxLeft <= minRight2 && maxLeft2 <= minRight) {
if ((m + n) % 2 == 0) {
return (maxOf(maxLeft, maxLeft2).toDouble() + minOf(minRight, minRight2).toDouble()) / 2
} else {
return maxOf(maxLeft, maxLeft2).toDouble()
}
} else if (maxLeft > minRight2) {
right = i - 1
} else {
left = i + 1
}
}
return 0.0
}
```
时间复杂度为 O(log(min(m, n))),空间复杂度为 O(1)。
使用kotlin解决这个问题:350. 两个数组的交集 II 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2,2] 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[4,9] 提示: 1 <= nums1.length, nums2.length <= 1000 0 <= nums1[i], nums2[i] <= 1000
下面是使用 Kotlin 解决 LeetCode 350. 两个数组的交集 II 的代码:
```kotlin
fun intersect(nums1: IntArray, nums2: IntArray): IntArray {
val map = mutableMapOf<Int, Int>()
for (num in nums1) {
map[num] = map.getOrDefault(num, 0) + 1
}
val result = mutableListOf<Int>()
for (num in nums2) {
if (map.containsKey(num) && map[num]!! > 0) {
result.add(num)
map[num] = map[num]!! - 1
}
}
return result.toIntArray()
}
```
首先,我们使用一个 `Map` 来记录 `nums1` 中每个元素出现的次数。然后,我们遍历 `nums2` 中的每个元素,如果该元素在 `Map` 中存在,并且出现次数大于 `0`,则将其添加到结果列表中,并将其在 `Map` 中的出现次数减 `1`。最后,我们将结果列表转换为整数数组并返回。
注意:由于题目要求返回的交集中每个元素出现的次数应与元素在两个数组中都出现的次数一致,因此我们在使用 `Map` 记录 `nums1` 中每个元素出现次数时,应该将重复出现的元素计数,而不是只记录它们出现的次数。
阅读全文