План курса / Все задачи / Алгоритмы и структуры данных
Общие элементы массивов
легко
# решено
Даны два отсортированных по возрастанию массива nums1 и nums2. Необходимо вернуть новый массив nums3, который содержит все общие элементы из nums1 и nums2.
Результат должен быть также отсортирован по возрастанию. Если элементы встречаются в массивах несколько раз, то их нужно продублировать в ответе.
public class Solution
{
public static List<int> Intersect(List<int> nums1, List<int> nums2)
{
int p1 = 0;
int p2 = 0;
List<int> res = new List<int>();
// Т.к. мы можем иметь дубликаты, на каждой итерации сравниваем на равенство
// и если равны - двигаем оба указателя и добавляем в результат.
// Иначе двигаем указатель, который указывает на меньшее значение.
while (p1 < nums1.Count && p2 < nums2.Count)
{
if (nums1[p1] > nums2[p2])
{
p2++;
}
else if (nums1[p1] < nums2[p2])
{
p1++;
}
else
{
res.Add(nums1[p1]);
p1++;
p2++;
}
}
return res;
}
}
#include <vector>
using namespace std;
vector<int> intersect(const vector<int>& nums1, const vector<int>& nums2) {
int p1 = 0;
int p2 = 0;
vector<int> res;
// Т.к. мы можем иметь дубликаты, на каждой итерации сравниваем на равенство
// и если равны - двигаем оба указателя и добавляем в результат.
// Иначе двигаем указатель, который указывает на меньшее значение.
while (p1 < nums1.size() && p2 < nums2.size()) {
if (nums1[p1] > nums2[p2]) {
p2++;
} else if (nums1[p1] < nums2[p2]) {
p1++;
} else {
res.push_back(nums1[p1]);
p1++;
p2++;
}
}
return res;
}
package main
func intersect(nums1 []int, nums2 []int) []int {
p1 := 0
p2 := 0
var res []int
// Т.к. мы можем иметь дубликаты, на каждой итерации сравниваем на равенство
// и если равны - двигаем оба указателя и добавляем в результат.
// Иначе двигаем указатель, который указывает на меньшее значение.
for p1 < len(nums1) && p2 < len(nums2) {
if nums1[p1] > nums2[p2] {
p2++
} else if nums1[p1] < nums2[p2] {
p1++
} else {
res = append(res, nums1[p1])
p1++
p2++
}
}
return res
}
import java.util.*;
public class Solution {
public List<Integer> intersect(List<Integer> nums1, List<Integer> nums2) {
int p1 = 0;
int p2 = 0;
List<Integer> res = new ArrayList<>();
// Т.к. мы можем иметь дубликаты, на каждой итерации сравниваем на равенство
// и если равны - двигаем оба указателя и добавляем в результат.
// Иначе двигаем указатель, который указывает на меньшее значение.
while (p1 < nums1.size() && p2 < nums2.size()) {
if (nums1.get(p1) > nums2.get(p2)) {
p2++;
} else if (nums1.get(p1) < nums2.get(p2)) {
p1++;
} else {
res.add(nums1.get(p1));
p1++;
p2++;
}
}
return res;
}
}
from typing import *
def intersect(nums1: List[int], nums2: List[int]) -> List[int]:
p1 = 0
p2 = 0
res = []
# Т.к. мы можем иметь дубликаты, на каждой итерации сравниваем на равенство
# и если равны - двигаем оба указателя и добавляем в результат.
# Иначе двигаем указатель, который указывает на меньшее значение.
while p1 < len(nums1) and p2 < len(nums2):
if nums1[p1] > nums2[p2]:
p2 += 1
elif nums1[p1] < nums2[p2]:
p1 += 1
else:
res.append(nums1[p1])
p1 += 1
p2 += 1
return res
export function intersect(nums1, nums2) {
let p1 = 0;
let p2 = 0;
const res = [];
// Т.к. мы можем иметь дубликаты, на каждой итерации сравниваем на равенство
// и если равны - двигаем оба указателя и добавляем в результат.
// Иначе двигаем указатель, который указывает на меньшее значение.
while (p1 < nums1.length && p2 < nums2.length) {
if (nums1[p1] > nums2[p2]) {
p2 += 1;
} else if (nums1[p1] < nums2[p2]) {
p1 += 1;
} else {
res.push(nums1[p1]);
p1 += 1;
p2 += 1;
}
}
return res;
}
Оценка сложности
Время: O(n+m), где n - размер массива nums1, m - размер массива nums2
Память: O(min(n,m)), где n - размер массива nums1, m - размер массива nums2