442. Find All Duplicates in an Array
leetcode medium
Task
Дан целочисленный массив nums длины n, где все целые числа nums находятся в диапазоне [1, n], и каждое число появляется один или два раза. Верните массив всех чисел, которые появляются дважды.
C# solution
matched/originalpublic class Solution {
public IList<int> FindDuplicates(int[] nums) {
List<int> ans = new List<int>();
for (int i = 0; i < nums.Length; i++)
for (int j = i + 1; j < nums.Length; j++) {
if (nums[j] == nums[i]) {
ans.Add(nums[i]);
break;
}
}
return ans;
}
}C++ solution
auto-draft, review before submit#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 vector<int> FindDuplicates(vector<int>& nums) {
List<int> ans = new List<int>();
for (int i = 0; i < nums.size(); i++)
for (int j = i + 1; j < nums.size(); j++) {
if (nums[j] == nums[i]) {
ans.push_back(nums[i]);
break;
}
}
return ans;
}
}Java solution
matched/originalclass Solution {
public List<Integer> findDuplicates(int[] nums) {
List<Integer> ans = new ArrayList<>();
for (int i = 0; i < nums.length; i++)
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] == nums[i]) {
ans.add(nums[i]);
break;
}
}
return ans;
}
}JavaScript solution
matched/originalvar findDuplicates = function(nums) {
let ans = [];
for (let i = 0; i < nums.length; i++) {
for (let j = i + 1; j < nums.length; j++) {
if (nums[j] === nums[i]) {
ans.push(nums[i]);
break;
}
}
}
return ans;
};Python solution
matched/originalclass Solution:
def findDuplicates(self, nums: List[int]) -> List[int]:
ans = []
for i in range(len(nums)):
for j in range(i + 1, len(nums)):
if nums[j] == nums[i]:
ans.append(nums[i])
break
return ansGo solution
matched/originalfunc findDuplicates(nums []int) []int {
ans := []int{}
for i := 0; i < len(nums); i++ {
for j := i + 1; j < len(nums); j++ {
if nums[j] == nums[i] {
ans = append(ans, nums[i])
break
}
}
}
return ans
}Explanation
Algorithm
Пример:
Input: nums = [4,3,2,7,8,2,3,1]
Output: [2,3]
👨💻
Алгоритм:
Когда мы итерируемся по элементам входного массива, мы можем просто искать любое другое вхождение текущего элемента в оставшейся части массива.
Поскольку элемент может появляться только один или два раза, нам не нужно беспокоиться о получении дубликатов элементов, которые появляются дважды: Случай I: Если элемент встречается в массиве только один раз, при поиске его в остальной части массива ничего не найдется. Случай II: Если элемент встречается дважды, вы найдете второе вхождение элемента в оставшейся части массива. Когда вы наткнетесь на второе вхождение в более поздней итерации, это будет аналогично случаю I (поскольку больше вхождений этого элемента в оставшейся части массива не будет).
Таким образом, можно эффективно определить все элементы, которые встречаются дважды, и добавить их в результирующий массив, проходя по каждому элементу массива и проверяя наличие его второго вхождения в оставшейся части массива.
😎