757. Set Intersection Size At Least Two
leetcode hard
#array#csharp#hard#hash-table#intervals#leetcode#sort
Task
Вам дан двумерный целочисленный массив intervals, в котором intervals[i] = [starti, endi] представляет все целые числа от starti до endi включительно. Содержащее множество - это массив nums, в котором каждый интервал из intervals содержит не менее двух целых чисел в nums. Например, если intervals = [[1,3], [3,7], [8,9]], то [1,2,4,7,8,9] и [2,3,4,8,9] - содержащие множества. Верните минимально возможный размер содержащего множества.
Пример:
Input: intervals = [[1,3],[3,7],[8,9]]
Output: 5
C# solution
matched/originalusing System;
using System.Collections.Generic;
public class Solution {
public int MinSetSize(int[][] intervals) {
Array.Sort(intervals, (a, b) => a[1].CompareTo(b[1]));
var nums = new List<int>();
foreach (var interval in intervals) {
int start = interval[0];
int end = interval[1];
if (nums.Count == 0 || nums[nums.Count - 1] < start) {
nums.Add(end - 1);
nums.Add(end);
} else if (nums[nums.Count - 1] == end - 1) {
nums.Add(end);
}
}
return nums.Count;
}
}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 int MinSetSize(int[][] intervals) {
Array.Sort(intervals, (a, b) => a[1].CompareTo(b[1]));
var nums = new List<int>();
foreach (var interval in intervals) {
int start = interval[0];
int end = interval[1];
if (nums.size() == 0 || nums[nums.size() - 1] < start) {
nums.push_back(end - 1);
nums.push_back(end);
} else if (nums[nums.size() - 1] == end - 1) {
nums.push_back(end);
}
}
return nums.size();
}
}Java solution
auto-draft, review before submitimport java.util.*;
import java.math.*;
// Auto-generated Java draft from the C# solution. Review API differences before LeetCode submit.
public class Solution {
public int MinSetSize(int[][] intervals) {
Array.Sort(intervals, (a, b) => a[1].CompareTo(b[1]));
var nums = new List<int>();
foreach (var interval in intervals) {
int start = interval[0];
int end = interval[1];
if (nums.size() == 0 || nums[nums.size() - 1] < start) {
nums.add(end - 1);
nums.add(end);
} else if (nums[nums.size() - 1] == end - 1) {
nums.add(end);
}
}
return nums.size();
}
}JavaScript solution
matched/originalfunction minSetSize(intervals) {
intervals.sort((a, b) => a[1] - b[1]);
let nums = [];
for (let [start, end] of intervals) {
if (nums.length === 0 || nums[nums.length - 1] < start) {
nums.push(end - 1);
nums.push(end);
} else if (nums[nums.length - 1] === end - 1) {
nums.push(end);
}
}
return nums.length;
}Python solution
matched/originaldef minSetSize(intervals):
intervals.sort(key=lambda x: x[1])
nums = []
for start, end in intervals:
if not nums or nums[-1] < start:
nums.append(end - 1)
nums.append(end)
elif nums[-1] == end - 1:
nums.append(end)
return len(nums)Go solution
matched/originalpackage main
import (
"sort"
)
func minSetSize(intervals [][]int) int {
sort.Slice(intervals, func(i, j int) bool {
return intervals[i][1] < intervals[j][1]
})
nums := []int{}
for _, interval := range intervals {
start, end := interval[0], interval[1]
if len(nums) == 0 || nums[len(nums)-1] < start {
nums = append(nums, end-1)
nums = append(nums, end)
} else if nums[len(nums)-1] == end-1 {
nums = append(nums, end)
}
}
return len(nums)
}Explanation
Algorithm
Отсортируйте интервалы по их конечным точкам.
Инициализируйте пустое множество для хранения чисел.
Пройдите по каждому интервалу, добавляя необходимые числа в множество так, чтобы каждый интервал содержал не менее двух чисел из этого множества.
😎