План курса / Все задачи / Алгоритмы и структуры данных
Удаление дубликатов 2
легко
# решено
Дан массив nums, состоящий из целых чисел. Требуется изменить исходный массив, удалив все дубликаты элементов так, чтобы осталось только первое вхождение каждого уникального значения. Порядок оставшихся элементов должен сохраниться.
В качестве результата верните измененный массив nums.
Пример 1:
Ввод: nums = [3,2,1,1,0,4,5,2,0]
Вывод: [3,2,1,0,4,5]
Объяснение: [3,2,1,X,0,4,5,X,X], где Х - значения, которые уже были в массиве
Пример 2:
Ввод: nums = [1,1,1,1]
Вывод: [1]
Ограничения
len(nums) >= 0
using System.Collections.Generic;
public class Solution {
public static List<int> RemoveDuplicates(List<int> nums) {
HashSet<int> used = new HashSet<int>();
// указывает на какую позицию запишем
int p1 = 0;
// указывает на следующий элемент, который не встречался раньше
int p2 = 0;
while (p2 < nums.Count) {
if (!used.Contains(nums[p2])) {
int temp = nums[p1];
nums[p1] = nums[p2];
nums[p2] = temp;
used.Add(nums[p1]);
p1++;
}
p2++;
}
// удаляем дубликаты
return nums.GetRange(0, p1);
}
}
#include <vector>
#include <unordered_set>
using namespace std;
vector<int> removeDuplicates(vector<int>& nums) {
unordered_set<int> used;
// указывает на какую позицию запишем
int p1 = 0;
// указывает на следующий элемент, который не встречался раньше
int p2 = 0;
while (p2 < nums.size()) {
if (used.find(nums[p2]) == used.end()) {
// Обмен значениями
swap(nums[p1], nums[p2]);
used.insert(nums[p1]);
p1++;
}
p2++;
}
// удаляем дубликаты
nums.resize(p1);
return nums;
}
package main
func removeDuplicates(nums []int) []int {
used := make(map[int]bool)
// указывает на какую позицию запишем
p1 := 0
// указывает на следующий элемент, который не встречался раньше
p2 := 0
for p2 < len(nums) {
if !used[nums[p2]] {
nums[p1], nums[p2] = nums[p2], nums[p1]
used[nums[p1]] = true
p1++
}
p2++
}
// удаляем дубликаты
return nums[:p1]
}
import java.util.*;
public class Solution {
public List<Integer> removeDuplicates(List<Integer> nums) {
Set<Integer> used = new HashSet<>();
// указывает на какую позицию запишем
int p1 = 0;
// указывает на следующий элемент, который не встречался раньше
int p2 = 0;
while (p2 < nums.size()) {
if (!used.contains(nums.get(p2))) {
Collections.swap(nums, p1, p2);
used.add(nums.get(p1));
p1++;
}
p2++;
}
// удаляем дубликаты
return nums.subList(0, p1);
}
}
from typing import *
def remove_duplicates(nums: List[int]) -> List[int]:
used = set()
# указывает на какую позицию запишем
p1 = 0
# указывает на следующий элемент, который не встречался раньше
p2 = 0
while p2 < len(nums):
if nums[p2] not in used:
nums[p1], nums[p2] = nums[p2], nums[p1]
used.add(nums[p1])
p1 += 1
p2 += 1
# удаляем дубликаты
return nums[:p1]
/**
* @param {number[]} nums
* @returns {number[]}
*/
export function removeDuplicates(nums) {
const used = new Set();
// указывает на какую позицию запишем
let p1 = 0;
// указывает на следующий элемент, который не встречался раньше
let p2 = 0;
while (p2 < nums.length) {
if (!used.has(nums[p2])) {
[nums[p1], nums[p2]] = [nums[p2], nums[p1]];
used.add(nums[p1]);
p1++;
}
p2++;
}
// удаляем дубликаты
nums.splice(p1);
return nums;
}
Оценка сложности
Время: O(n)
Память: O(n)
nums[p1], nums[p2] = nums[p2], nums[p1] можно заменить просто на nums[p1] = nums[p2] - оба варианта корректны.