80. Remove Duplicates from Sorted Array II
Дан массив целых чисел nums, отсортированный в неубывающем порядке. Удалите из него некоторые дубликаты на месте так, чтобы каждый уникальный элемент встречался не более двух раз. Относительный порядок элементов должен быть сохранён.
Поскольку в некоторых языках программирования невозможно изменить длину массива, результат следует разместить в первой части массива nums. Более формально, если после удаления дубликатов остаётся k элементов, то первые k элементов массива nums должны содержать итоговый результат. Не важно, что остаётся за пределами первых k элементов.
Верните k после размещения итогового результата в первые k слотов массива nums.
Не выделяйте дополнительное пространство для другого массива. Вы должны сделать это, изменяя исходный массив на месте с использованием дополнительной памяти O(1).
Пример:
Input: nums = [1,1,1,2,2,3]
Output: 5, nums = [1,1,2,2,3,_]
Explanation: Your function should return k = 5, with the first five elements of nums being 1, 1, 2, 2 and 3 respectively.
It does not matter what you leave beyond the returned k (hence they are underscores).
C# решение
сопоставлено/оригиналpublic class Solution {
public int RemoveDuplicates(int[] nums) {
if (nums.Length < 3)
return nums.Length;
int j = 2;
for (int i = 2; i < nums.Length; i++) {
if (nums[i] != nums[j - 2]) {
nums[j++] = nums[i];
}
}
return j;
}
}
C++ решение
auto-draft, проверить перед отправкой#include <bits/stdc++.h>
using namespace std;
// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
public int RemoveDuplicates(vector<int>& nums) {
if (nums.size() < 3)
return nums.size();
int j = 2;
for (int i = 2; i < nums.size(); i++) {
if (nums[i] != nums[j - 2]) {
nums[j++] = nums[i];
}
}
return j;
}
}
Java решение
сопоставлено/оригиналclass Solution {
public int[] remElement(int[] arr, int index) {
for (int i = index + 1; i < arr.length; i++) {
arr[i - 1] = arr[i];
}
return arr;
}
public int removeDuplicates(int[] nums) {
int i = 1, count = 1, length = nums.length;
while (i < length) {
if (nums[i] == nums[i - 1]) {
count++;
if (count > 2) {
this.remElement(nums, i);
i--;
length--;
}
} else {
count = 1;
}
i++;
}
return length;
}
}
JavaScript решение
сопоставлено/оригиналvar removeDuplicates = function (nums) {
let j = 0;
for (let i = 0; i < nums.length; i++) {
if (j < 2 || nums[i] > nums[j - 2]) {
nums[j++] = nums[i];
}
}
return j;
};
Python решение
сопоставлено/оригиналclass Solution(object):
def removeDuplicates(self, nums):
i, count = 1, 1
while i < len(nums):
if nums[i] == nums[i - 1]:
count += 1
if count > 2:
nums.pop(i)
i -= 1
else:
count = 1
i += 1
return len(nums)
Go решение
сопоставлено/оригиналfunc removeDuplicates(nums []int) int {
j := 0
for i := 0; i < len(nums); i++ {
if j < 2 || nums[i] > nums[j-2] {
nums[j] = nums[i]
j++
}
}
return j
}
Algorithm
1️⃣
Инициализация переменных: Используйте две переменные: i, которая указывает на текущий индекс в массиве, и count, которая отслеживает количество каждого элемента. Начните обработку массива с первого элемента (индекс 1), предполагая, что первый элемент всегда имеет count равный 1.
2️⃣
Обработка элементов массива: Для каждого элемента в массиве:
3️⃣
Если текущий элемент такой же, как предыдущий (nums[i] == nums[i - 1]), увеличьте count.
Если count больше 2, это означает, что текущий элемент встречается более двух раз. В этом случае удалите этот элемент из массива с помощью операции удаления, поддерживаемой вашим языком программирования (например, del, pop, remove), и уменьшите индекс i на 1, чтобы корректно обработать следующий элемент.
Если текущий элемент отличается от предыдущего (nums[i] != nums[i - 1]), это означает начало новой последовательности, поэтому сбросьте count к 1.
Возвращение результата: После обработки всех элементов в массиве, все ненужные дубликаты удалены, и в массиве остаются только допустимые элементы. Верните длину обработанного массива, так как это количество элементов, которые теперь соответствуют условиям задачи.
😎
Вакансии для этой задачи
Показаны активные вакансии с пересечением по тегам задачи.