480. Sliding Window Median
Медиана — это среднее значение в упорядоченном списке целых чисел. Если размер списка четный, среднего значения не существует, поэтому медианой считается среднее значение двух средних чисел.
На示例, если arr = [2, 3, 4], медиана равна 3.
На示例, если arr = [1, 2, 3, 4], медиана равна (2 + 3) / 2 = 2.5.
Вам дан 整数 数组 nums и 整数 k. Существует скользящее окно размера k, которое перемещается от самого левого края 数组а до самого правого. Вы можете видеть только k чисел в окне. Каждый раз скользящее окно перемещается вправо на одну позицию.
return 数组 медиан для каждого окна в исходном 数组е. Ответы с точностью до 10^-5 будут приниматься.
示例:
Input: nums = [1,3,-1,-3,5,3,6,7], k = 3
Output: [1.00000,-1.00000,-1.00000,3.00000,5.00000,6.00000]
Explanation:
Window position Median
--------------- -----
[1 3 -1] -3 5 3 6 7 1
1 [3 -1 -3] 5 3 6 7 -1
1 3 [-1 -3 5] 3 6 7 -1
1 3 -1 [-3 5 3] 6 7 3
1 3 -1 -3 [5 3 6] 7 5
1 3 -1 -3 5 [3 6 7] 6
C# 解法
匹配/原始using System;
using System.Collections.Generic;
using System.Linq;
public class Solution {
public IList<double> MedianSlidingWindow(int[] nums, int k) {
List<double> medians = new List<double>();
for (int i = 0; i + k <= nums.Length; i++) {
int[] window = new int[k];
Array.Copy(nums, i, window, 0, k);
Array.Sort(window);
if (k % 2 == 1) {
medians.Add(window[k / 2]);
} else {
medians.Add((window[k / 2 - 1] + window[k / 2]) / 2.0);
}
}
return medians;
}
}
C++ 解法
自动草稿,提交前请检查#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 IList<double> MedianSlidingWindow(vector<int>& nums, int k) {
List<double> medians = new List<double>();
for (int i = 0; i + k <= nums.size(); i++) {
vector<int>& window = new int[k];
Array.Copy(nums, i, window, 0, k);
sort(window.begin(), window.end());
if (k % 2 == 1) {
medians.push_back(window[k / 2]);
} else {
medians.push_back((window[k / 2 - 1] + window[k / 2]) / 2.0);
}
}
return medians;
}
}
Java 解法
匹配/原始import java.util.*;
public class Solution {
public double[] medianSlidingWindow(int[] nums, int k) {
List<Double> medians = new ArrayList<>();
for (int i = 0; i + k <= nums.length; i++) {
int[] window = Arrays.copyOfRange(nums, i, i + k);
Arrays.sort(window);
if (k % 2 == 1) {
medians.add((double) window[k / 2]);
} else {
medians.add((window[k / 2 - 1] + window[k / 2]) / 2.0);
}
}
double[] result = new double[medians.size()];
for (int i = 0; i < medians.size(); i++) {
result[i] = medians.get(i);
}
return result;
}
}
JavaScript 解法
匹配/原始var medianSlidingWindow = function(nums, k) {
let medians = [];
for (let i = 0; i + k <= nums.length; i++) {
let window = nums.slice(i, i + k).sort((a, b) => a - b);
if (k % 2 === 1) {
medians.push(window[Math.floor(k / 2)]);
} else {
medians.push((window[k / 2 - 1] + window[k / 2]) / 2);
}
}
return medians;
};
Python 解法
匹配/原始from typing import List
def medianSlidingWindow(nums: List[int], k: int) -> List[float]:
medians = []
for i in range(len(nums) - k + 1):
window = sorted(nums[i:i + k])
if k % 2 == 1:
medians.append(window[k // 2])
else:
medians.append((window[k // 2 - 1] + window[k // 2]) / 2)
return medians
Go 解法
匹配/原始package main
import (
"sort"
)
func medianSlidingWindow(nums []int, k int) []float64 {
var medians []float64
for i := 0; i + k <= len(nums); i++ {
window := append([]int(nil), nums[i:i+k]...)
sort.Ints(window)
if k % 2 == 1 {
medians = append(medians, float64(window[k/2]))
} else {
medians = append(medians, float64(window[k/2-1]+window[k/2])/2.0)
}
}
return medians
}
Algorithm
Сохраняйте числа в контейнере окна размера k, выполняя следующие операции: Вставка 输入ящего elementа. Удаление 输出ящего elementа.
Отсортируйте окно, чтобы find медианы. Вместо того чтобы каждый раз копировать и сортировать k последовательных elementов из 输入ных данных, вставляйте и удаляйте по одному elementу при каждом сдвиге окна.
Поддерживайте окно в отсортированном состоянии до и после операций вставки и удаления.
😎
Vacancies for this task
活跃职位 with overlapping task tags are 已显示.