从k列表中查找包含元素的最小范围

给定k个大小为n的整数排序列表,从k个列表中找出至少包含元素的最小范围。如果找到多个最小范围,请打印其中任何一个。

null

例子:

Input: K = 3arr1[] : [4, 7, 9, 12, 15]arr2[] : [0, 8, 10, 14, 20]arr3[] : [6, 12, 16, 30, 50]Output:The smallest range is [6 8]Explanation: Smallest range is formed by number 7 from the first list, 8 from secondlist and 6 from the third list.Input: k = 3arr1[] : [4, 7]arr2[] : [1, 2]arr3[] : [20, 40]Output:The smallest range is [2 20]Explanation:The range [2, 20] contains 2, 4, 7, 20which contains element from all the three arrays.

天真的方法: 给定K个排序列表,找出每个列表中至少有一个元素的范围。解决这个问题的思路很简单,保持构成范围内元素的k个指针,通过取k个元素的最小值和最大值,可以形成范围。最初,所有指针将指向所有k数组的开头。存储从最大到最小的范围。如果必须最小化范围,则必须增加最小值或减小最大值。数组排序时,最大值不能减少,但最小值可以增加。要继续增加最小值,请增加包含最小值的列表的指针,并更新范围,直到其中一个列表耗尽。

  • 算法:
    1. 创造一个额外的空间 ptr 用于存储指针和变量的长度为k 米兰奇 初始化为最大值。
    2. 最初,每个列表的索引都是0,因此初始化 ptr[0..k] 如果设置为0,数组ptr将存储范围内元素的索引。
    3. 重复以下步骤,直到至少有一个列表排气:
      1. 现在在ptr[0…k]数组指向的所有列表的当前元素中找到最小值和最大值。
      2. 现在,如果当前(最大最小)小于最小范围,则更新最小范围。
      3. 递增指向当前最小元素的指针。
  • 实施:

C++

// C++ program to finds out smallest range that includes
// elements from each of the given sorted lists.
#include <bits/stdc++.h>
using namespace std;
#define N 5
// array for storing the current index of list i
int ptr[501];
// This function takes an k sorted lists in the form of
// 2D array as an argument. It finds out smallest range
// that includes elements from each of the k lists.
void findSmallestRange( int arr[][N], int n, int k)
{
int i, minval, maxval, minrange, minel, maxel, flag, minind;
// initializing to 0 index;
for (i = 0; i <= k; i++)
ptr[i] = 0;
minrange = INT_MAX;
while (1) {
// for maintaining the index of list containing the minimum element
minind = -1;
minval = INT_MAX;
maxval = INT_MIN;
flag = 0;
// iterating over all the list
for (i = 0; i < k; i++) {
// if every element of list[i] is traversed then break the loop
if (ptr[i] == n) {
flag = 1;
break ;
}
// find minimum value among all the list elements pointing by the ptr[] array
if (ptr[i] < n && arr[i][ptr[i]] < minval) {
minind = i; // update the index of the list
minval = arr[i][ptr[i]];
}
// find maximum value among all the list elements pointing by the ptr[] array
if (ptr[i] < n && arr[i][ptr[i]] > maxval) {
maxval = arr[i][ptr[i]];
}
}
// if any list exhaust we will not get any better answer, so break the while loop
if (flag)
break ;
ptr[minind]++;
// updating the minrange
if ((maxval - minval) < minrange) {
minel = minval;
maxel = maxval;
minrange = maxel - minel;
}
}
printf ( "The smallest range is [%d, %d]" , minel, maxel);
}
// Driver program to test above function
int main()
{
int arr[][N] = {
{ 4, 7, 9, 12, 15 },
{ 0, 8, 10, 14, 20 },
{ 6, 12, 16, 30, 50 }
};
int k = sizeof (arr) / sizeof (arr[0]);
findSmallestRange(arr, N, k);
return 0;
}
// This code is contributed by Aditya Krishna Namdeo


JAVA

// Java program to finds out smallest range that includes
// elements from each of the given sorted lists.
class GFG {
static final int N = 5 ;
// array for storing the current index of list i
static int ptr[] = new int [ 501 ];
// This function takes an k sorted lists in the form of
// 2D array as an argument. It finds out smallest range
// that includes elements from each of the k lists.
static void findSmallestRange( int arr[][], int n, int k)
{
int i, minval, maxval, minrange, minel = 0 , maxel = 0 , flag, minind;
// initializing to 0 index;
for (i = 0 ; i <= k; i++) {
ptr[i] = 0 ;
}
minrange = Integer.MAX_VALUE;
while ( true ) {
// for maintaining the index of list containing the minimum element
minind = - 1 ;
minval = Integer.MAX_VALUE;
maxval = Integer.MIN_VALUE;
flag = 0 ;
// iterating over all the list
for (i = 0 ; i < k; i++) {
// if every element of list[i] is traversed then break the loop
if (ptr[i] == n) {
flag = 1 ;
break ;
}
// find minimum value among all the list elements pointing by the ptr[] array
if (ptr[i] < n && arr[i][ptr[i]] < minval) {
minind = i; // update the index of the list
minval = arr[i][ptr[i]];
}
// find maximum value among all the list elements pointing by the ptr[] array
if (ptr[i] < n && arr[i][ptr[i]] > maxval) {
maxval = arr[i][ptr[i]];
}
}
// if any list exhaust we will not get any better answer, so break the while loop
if (flag == 1 ) {
break ;
}
ptr[minind]++;
// updating the minrange
if ((maxval - minval) < minrange) {
minel = minval;
maxel = maxval;
minrange = maxel - minel;
}
}
System.out.printf( "The smallest range is [%d, %d]" , minel, maxel);
}
// Driver program to test above function
public static void main(String[] args)
{
int arr[][] = {
{ 4 , 7 , 9 , 12 , 15 },
{ 0 , 8 , 10 , 14 , 20 },
{ 6 , 12 , 16 , 30 , 50 }
};
int k = arr.length;
findSmallestRange(arr, N, k);
}
}
// this code contributed by Rajput-Ji


python

# Python3 program to finds out
# smallest range that includes
# elements from each of the
# given sorted lists.
N = 5
# array for storing the
# current index of list i
ptr = [ 0 for i in range ( 501 )]
# This function takes an k sorted
# lists in the form of 2D array as
# an argument. It finds out smallest
# range that includes elements from
# each of the k lists.
def findSmallestRange(arr, n, k):
i, minval, maxval, minrange, minel, maxel, flag, minind = 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0
# initializing to 0 index
for i in range (k + 1 ):
ptr[i] = 0
minrange = 10 * * 9
while ( 1 ):
# for maintaining the index of list
# containing the minimum element
minind = - 1
minval = 10 * * 9
maxval = - 10 * * 9
flag = 0
# iterating over all the list
for i in range (k):
# if every element of list[i] is
# traversed then break the loop
if (ptr[i] = = n):
flag = 1
break
# find minimum value among all the list
# elements pointing by the ptr[] array
if (ptr[i] < n and arr[i][ptr[i]] < minval):
minind = i # update the index of the list
minval = arr[i][ptr[i]]
# find maximum value among all the
# list elements pointing by the ptr[] array
if (ptr[i] < n and arr[i][ptr[i]] > maxval):
maxval = arr[i][ptr[i]]
# if any list exhaust we will
# not get any better answer,
# so break the while loop
if (flag):
break
ptr[minind] + = 1
# updating the minrange
if ((maxval - minval) < minrange):
minel = minval
maxel = maxval
minrange = maxel - minel
print ( "The smallest range is [" , minel, maxel, "]" )
# Driver code
arr = [
[ 4 , 7 , 9 , 12 , 15 ],
[ 0 , 8 , 10 , 14 , 20 ],
[ 6 , 12 , 16 , 30 , 50 ]
]
k = len (arr)
findSmallestRange(arr, N, k)
# This code is contributed by mohit kumar


C#

// C# program to finds out smallest
// range that includes elements from
// each of the given sorted lists.
using System;
class GFG {
static int N = 5;
// array for storing the current index of list i
static int [] ptr = new int [501];
// This function takes an k sorted
// lists in the form of 2D array as
// an argument. It finds out smallest range
// that includes elements from each of the k lists.
static void findSmallestRange( int [, ] arr,
int n, int k)
{
int i, minval, maxval, minrange,
minel = 0, maxel = 0, flag, minind;
// initializing to 0 index;
for (i = 0; i <= k; i++) {
ptr[i] = 0;
}
minrange = int .MaxValue;
while ( true ) {
// for maintaining the index of
// list containing the minimum element
minind = -1;
minval = int .MaxValue;
maxval = int .MinValue;
flag = 0;
// iterating over all the list
for (i = 0; i < k; i++) {
// if every element of list[i]
// is traversed then break the loop
if (ptr[i] == n) {
flag = 1;
break ;
}
// find minimum value among all the
// list elements pointing by the ptr[] array
if (ptr[i] < n && arr[i, ptr[i]] < minval) {
minind = i; // update the index of the list
minval = arr[i, ptr[i]];
}
// find maximum value among all the
// list elements pointing by the ptr[] array
if (ptr[i] < n && arr[i, ptr[i]] > maxval) {
maxval = arr[i, ptr[i]];
}
}
// if any list exhaust we will
// not get any better answer,
// so break the while loop
if (flag == 1) {
break ;
}
ptr[minind]++;
// updating the minrange
if ((maxval - minval) < minrange) {
minel = minval;
maxel = maxval;
minrange = maxel - minel;
}
}
Console.WriteLine( "The smallest range is"
+ "[{0}, {1}]" ,
minel, maxel);
}
// Driver code
public static void Main(String[] args)
{
int [, ] arr = {
{ 4, 7, 9, 12, 15 },
{ 0, 8, 10, 14, 20 },
{ 6, 12, 16, 30, 50 }
};
int k = arr.GetLength(0);
findSmallestRange(arr, N, k);
}
}
// This code has been contributed by 29AjayKumar


Javascript

<script>
// Javascript program to finds out smallest range that includes
// elements from each of the given sorted lists.
let N = 5;
// array for storing the current index of list i
let ptr= new Array(501);
// This function takes an k sorted lists in the form of
// 2D array as an argument. It finds out smallest range
// that includes elements from each of the k lists.
function findSmallestRange(arr,n,k)
{
let i, minval, maxval, minrange, minel = 0, maxel = 0, flag, minind;
// initializing to 0 index;
for (i = 0; i <= k; i++) {
ptr[i] = 0;
}
minrange = Number.MAX_VALUE;
while ( true ) {
// for maintaining the index of list containing the minimum element
minind = -1;
minval = Number.MAX_VALUE;
maxval = Number.MIN_VALUE;
flag = 0;
// iterating over all the list
for (i = 0; i < k; i++) {
// if every element of list[i] is traversed then break the loop
if (ptr[i] == n) {
flag = 1;
break ;
}
// find minimum value among all the list elements pointing by the ptr[] array
if (ptr[i] < n && arr[i][ptr[i]] < minval) {
minind = i; // update the index of the list
minval = arr[i][ptr[i]];
}
// find maximum value among all the list elements pointing by the ptr[] array
if (ptr[i] < n && arr[i][ptr[i]] > maxval) {
maxval = arr[i][ptr[i]];
}
}
// if any list exhaust we will not get any better answer, so break the while loop
if (flag == 1) {
break ;
}
ptr[minind]++;
// updating the minrange
if ((maxval - minval) < minrange) {
minel = minval;
maxel = maxval;
minrange = maxel - minel;
}
}
document.write( "The smallest range is [" +minel+ ", " +maxel+ "]<br>" );
}
// Driver program to test above function
let arr = [
[4, 7, 9, 12, 15],
[0, 8, 10, 14, 20],
[6, 12, 16, 30, 50]
]
let k = arr.length;
findSmallestRange(arr, N, k);
// This code is contributed by unknown2108
</script>


输出:

The smallest range is [6 8]
  • 复杂性分析:
    • 时间复杂性: O(n*k) 2. ),要在长度为k的数组中找到最大值和最小值,所需时间为O(k),要遍历长度为n的所有k个数组(在最坏的情况下),时间复杂度为O(n*k),则总时间复杂度为O(n*k) 2. ).
    • 空间复杂性: O(k),长度k需要一个额外的数组,因此空间复杂度为O(k)

有效的方法 : 该方法保持不变,但通过使用min-heap或 优先级队列 .Min heap可用于在对数时间或对数k时间(而非线性时间)中查找最大值和最小值。其余的方法都是一样的。

  • 算法:
    1. 创建一个最小堆来存储k个元素,每个数组一个元素和一个变量 米兰奇 初始化为最大值,并保留一个变量 最大值 以存储最大整数。
    2. 首先从每个列表中放入每个元素的第一个元素,并将最大值存储在 最大值 .
    3. 重复以下步骤,直到至少有一个列表排气:
      1. 求最小值或 ,使用最小元素Min heap的顶部或根。
      2. 现在,如果当前(最大最小)小于最小范围,则更新最小范围。
      3. 从优先级队列中删除top或root元素,从包含min元素的列表中插入下一个元素,并用插入的新元素更新max。
  • 实施:

C++

// C++ program to finds out smallest range that includes
// elements from each of the given sorted lists.
#include <bits/stdc++.h>
using namespace std;
#define N 5
// A min heap node
struct MinHeapNode {
// The element to be stored
int element;
// index of the list from which the element is taken
int i;
// index of the next element to be picked from list
int j;
};
// Prototype of a utility function to swap two min heap nodes
void swap(MinHeapNode* x, MinHeapNode* y);
// A class for Min Heap
class MinHeap {
// pointer to array of elements in heap
MinHeapNode* harr;
// size of min heap
int heap_size;
public :
// Constructor: creates a min heap of given size
MinHeap(MinHeapNode a[], int size);
// to heapify a subtree with root at given index
void MinHeapify( int );
// to get index of left child of node at index i
int left( int i) { return (2 * i + 1); }
// to get index of right child of node at index i
int right( int i) { return (2 * i + 2); }
// to get the root
MinHeapNode getMin() { return harr[0]; }
// to replace root with new node x and heapify() new root
void replaceMin(MinHeapNode x)
{
harr[0] = x;
MinHeapify(0);
}
};
// Constructor: Builds a heap from a
// given array a[] of given size
MinHeap::MinHeap(MinHeapNode a[], int size)
{
heap_size = size;
harr = a; // store address of array
int i = (heap_size - 1) / 2;
while (i >= 0) {
MinHeapify(i);
i--;
}
}
// A recursive method to heapify a subtree with root at
// given index. This method assumes that the subtrees
// are already heapified
void MinHeap::MinHeapify( int i)
{
int l = left(i);
int r = right(i);
int smallest = i;
if (l < heap_size && harr[l].element < harr[i].element)
smallest = l;
if (r < heap_size && harr[r].element < harr[smallest].element)
smallest = r;
if (smallest != i) {
swap(harr[i], harr[smallest]);
MinHeapify(smallest);
}
}
// This function takes an k sorted lists in the form of
// 2D array as an argument. It finds out smallest range
// that includes elements from each of the k lists.
void findSmallestRange( int arr[][N], int k)
{
// Create a min heap with k heap nodes. Every heap node
// has first element of an list
int range = INT_MAX;
int min = INT_MAX, max = INT_MIN;
int start, end;
MinHeapNode* harr = new MinHeapNode[k];
for ( int i = 0; i < k; i++) {
// Store the first element
harr[i].element = arr[i][0];
// index of list
harr[i].i = i;
// Index of next element to be stored
// from list
harr[i].j = 1;
// store max element
if (harr[i].element > max)
max = harr[i].element;
}
// Create the heap
MinHeap hp(harr, k);
// Now one by one get the minimum element from min
// heap and replace it with next element of its list
while (1) {
// Get the minimum element and store it in output
MinHeapNode root = hp.getMin();
// update min
min = hp.getMin().element;
// update range
if (range > max - min + 1) {
range = max - min + 1;
start = min;
end = max;
}
// Find the next element that will replace current
// root of heap. The next element belongs to same
// list as the current root.
if (root.j < N) {
root.element = arr[root.i][root.j];
root.j += 1;
// update max element
if (root.element > max)
max = root.element;
}
// break if we have reached end of any list
else
break ;
// Replace root with next element of list
hp.replaceMin(root);
}
cout << "The smallest range is "
<< "["
<< start << " " << end << "]" << endl;
;
}
// Driver program to test above functions
int main()
{
int arr[][N] = {
{ 4, 7, 9, 12, 15 },
{ 0, 8, 10, 14, 20 },
{ 6, 12, 16, 30, 50 }
};
int k = sizeof (arr) / sizeof (arr[0]);
findSmallestRange(arr, k);
return 0;
}


JAVA

// Java program to find out smallest
// range that includes elements from
// each of the given sorted lists.
class GFG {
// A min heap node
static class Node {
// The element to be stored
int ele;
// index of the list from which
// the element is taken
int i;
// index of the next element
// to be picked from list
int j;
Node( int a, int b, int c)
{
this .ele = a;
this .i = b;
this .j = c;
}
}
// A class for Min Heap
static class MinHeap {
Node[] harr; // array of elements in heap
int size; // size of min heap
// Constructor: creates a min heap
// of given size
MinHeap(Node[] arr, int size)
{
this .harr = arr;
this .size = size;
int i = (size - 1 ) / 2 ;
while (i >= 0 ) {
MinHeapify(i);
i--;
}
}
// to get index of left child
// of node at index i
int left( int i)
{
return 2 * i + 1 ;
}
// to get index of right child
// of node at index i
int right( int i)
{
return 2 * i + 2 ;
}
// to heapify a subtree with
// root at given index
void MinHeapify( int i)
{
int l = left(i);
int r = right(i);
int small = i;
if (l < size && harr[l].ele < harr[i].ele)
small = l;
if (r < size && harr[r].ele < harr[small].ele)
small = r;
if (small != i) {
swap(small, i);
MinHeapify(small);
}
}
void swap( int i, int j)
{
Node temp = harr[i];
harr[i] = harr[j];
harr[j] = temp;
}
// to get the root
Node getMin()
{
return harr[ 0 ];
}
// to replace root with new node x
// and heapify() new root
void replaceMin(Node x)
{
harr[ 0 ] = x;
MinHeapify( 0 );
}
}
// This function takes an k sorted lists
// in the form of 2D array as an argument.
// It finds out smallest range that includes
// elements from each of the k lists.
static void findSmallestRange( int [][] arr, int k)
{
int range = Integer.MAX_VALUE;
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
int start = - 1 , end = - 1 ;
int n = arr[ 0 ].length;
// Create a min heap with k heap nodes.
// Every heap node has first element of an list
Node[] arr1 = new Node[k];
for ( int i = 0 ; i < k; i++) {
Node node = new Node(arr[i][ 0 ], i, 1 );
arr1[i] = node;
// store max element
max = Math.max(max, node.ele);
}
// Create the heap
MinHeap mh = new MinHeap(arr1, k);
// Now one by one get the minimum element
// from min heap and replace it with
// next element of its list
while ( true ) {
// Get the minimum element and
// store it in output
Node root = mh.getMin();
// update min
min = root.ele;
// update range
if (range > max - min + 1 ) {
range = max - min + 1 ;
start = min;
end = max;
}
// Find the next element that will
// replace current root of heap.
// The next element belongs to same
// list as the current root.
if (root.j < n) {
root.ele = arr[root.i][root.j];
root.j++;
// update max element
if (root.ele > max)
max = root.ele;
}
// break if we have reached
// end of any list
else
break ;
// Replace root with next element of list
mh.replaceMin(root);
}
System.out.print( "The smallest range is [" + start + " " + end + "]" );
}
// Driver Code
public static void main(String[] args)
{
int arr[][] = { { 4 , 7 , 9 , 12 , 15 },
{ 0 , 8 , 10 , 14 , 20 },
{ 6 , 12 , 16 , 30 , 50 } };
int k = arr.length;
findSmallestRange(arr, k);
}
}
// This code is contributed by nobody_cares


C#

// C# program to find out smallest
// range that includes elements from
// each of the given sorted lists.
using System;
using System.Collections.Generic;
class GFG {
// A min heap node
public class Node {
// The element to be stored
public int ele;
// index of the list from which
// the element is taken
public int i;
// index of the next element
// to be picked from list
public int j;
public Node( int a, int b, int c)
{
this .ele = a;
this .i = b;
this .j = c;
}
}
// A class for Min Heap
public class MinHeap {
// array of elements in heap
public Node[] harr;
// size of min heap
public int size;
// Constructor: creates a min heap
// of given size
public MinHeap(Node[] arr, int size)
{
this .harr = arr;
this .size = size;
int i = (size - 1) / 2;
while (i >= 0) {
MinHeapify(i);
i--;
}
}
// to get index of left child
// of node at index i
int left( int i)
{
return 2 * i + 1;
}
// to get index of right child
// of node at index i
int right( int i)
{
return 2 * i + 2;
}
// to heapify a subtree with
// root at given index
void MinHeapify( int i)
{
int l = left(i);
int r = right(i);
int small = i;
if (l < size && harr[l].ele < harr[i].ele)
small = l;
if (r < size && harr[r].ele < harr[small].ele)
small = r;
if (small != i) {
swap(small, i);
MinHeapify(small);
}
}
void swap( int i, int j)
{
Node temp = harr[i];
harr[i] = harr[j];
harr[j] = temp;
}
// to get the root
public Node getMin()
{
return harr[0];
}
// to replace root with new node x
// and heapify() new root
public void replaceMin(Node x)
{
harr[0] = x;
MinHeapify(0);
}
}
// This function takes an k sorted lists
// in the form of 2D array as an argument.
// It finds out smallest range that includes
// elements from each of the k lists.
static void findSmallestRange( int [, ] arr, int k)
{
int range = int .MaxValue;
int min = int .MaxValue;
int max = int .MinValue;
int start = -1, end = -1;
int n = arr.GetLength(0);
// Create a min heap with k heap nodes.
// Every heap node has first element of an list
Node[] arr1 = new Node[k];
for ( int i = 0; i < k; i++) {
Node node = new Node(arr[i, 0], i, 1);
arr1[i] = node;
// store max element
max = Math.Max(max, node.ele);
}
// Create the heap
MinHeap mh = new MinHeap(arr1, k);
// Now one by one get the minimum element
// from min heap and replace it with
// next element of its list
while ( true ) {
// Get the minimum element and
// store it in output
Node root = mh.getMin();
// update min
min = root.ele;
// update range
if (range > max - min + 1) {
range = max - min + 1;
start = min;
end = max;
}
// Find the next element that will
// replace current root of heap.
// The next element belongs to same
// list as the current root.
if (root.j < n) {
root.ele = arr[root.i, root.j];
root.j++;
// update max element
if (root.ele > max)
max = root.ele;
}
else
break ; // break if we have reached
// end of any list
// Replace root with next element of list
mh.replaceMin(root);
}
Console.Write( "The smallest range is [" + start + " " + end + "]" );
}
// Driver Code
public static void Main(String[] args)
{
int [, ] arr = { { 4, 7, 9, 12, 15 },
{ 0, 8, 10, 14, 20 },
{ 6, 12, 16, 30, 50 } };
int k = arr.GetLength(0);
findSmallestRange(arr, k);
}
}
// This code is contributed by Rajput-Ji


Javascript

<script>
// Javascript program to find out smallest
// range that includes elements from
// each of the given sorted lists.
class Node
{
constructor(a, b, c)
{
this .ele = a;
this .i = b;
this .j = c;
}
}
// A class for Min Heap
class MinHeap
{
// Array of elements in heap
harr;
// Size of min heap
size;
// Constructor: creates a min heap
// of given size
constructor(arr,size)
{
this .harr = arr;
this .size = size;
let i = Math.floor((size - 1) / 2);
while (i >= 0)
{
this .MinHeapify(i);
i--;
}
}
// To get index of left child
// of node at index i
left(i)
{
return 2 * i + 1;
}
// To get index of right child
// of node at index i
right(i)
{
return 2 * i + 2;
}
// To heapify a subtree with
// root at given index
MinHeapify(i)
{
let l = this .left(i);
let r = this .right(i);
let small = i;
if (l < this .size &&
this .harr[l].ele <
this .harr[i].ele)
small = l;
if (r < this .size &&
this .harr[r].ele <
this .harr[small].ele)
small = r;
if (small != i)
{
this .swap(small, i);
this .MinHeapify(small);
}
}
swap(i, j)
{
let temp = this .harr[i];
this .harr[i] = this .harr[j];
this .harr[j] = temp;
}
// To get the root
getMin()
{
return this .harr[0];
}
// To replace root with new node x
// and heapify() new root
replaceMin(x)
{
this .harr[0] = x;
this .MinHeapify(0);
}
}
// This function takes an k sorted lists
// in the form of 2D array as an argument.
// It finds out smallest range that includes
// elements from each of the k lists.
function findSmallestRange(arr, k)
{
let range = Number.MAX_VALUE;
let min = Number.MAX_VALUE;
let max = Number.MIN_VALUE;
let start = -1, end = -1;
let n = arr[0].length;
// Create a min heap with k heap nodes.
// Every heap node has first element of an list
let arr1 = new Array(k);
for (let i = 0; i < k; i++)
{
let node = new Node(arr[i][0], i, 1);
arr1[i] = node;
// Store max element
max = Math.max(max, node.ele);
}
// Create the heap
let mh = new MinHeap(arr1, k);
// Now one by one get the minimum element
// from min heap and replace it with
// next element of its list
while ( true )
{
// Get the minimum element and
// store it in output
let root = mh.getMin();
// Update min
min = root.ele;
// Update range
if (range > max - min + 1)
{
range = max - min + 1;
start = min;
end = max;
}
// Find the next element that will
// replace current root of heap.
// The next element belongs to same
// list as the current root.
if (root.j < n)
{
root.ele = arr[root.i][root.j];
root.j++;
// Update max element
if (root.ele > max)
max = root.ele;
}
// Break if we have reached
// end of any list
else
break ;
// Replace root with next element of list
mh.replaceMin(root);
}
document.write( "The smallest range is [" +
start + " " + end + "]" );
}
// Driver Code
let arr = [ [ 4, 7, 9, 12, 15 ],
[ 0, 8, 10, 14, 20 ],
[ 6, 12, 16, 30, 50 ] ];
let k = arr.length;
findSmallestRange(arr, k);
// This code is contributed by rag2127
</script>


输出:

The smallest range is [6 8]
  • 复杂性分析:
    • 时间复杂性: O(n*k*logk)。 要在长度为k的最小堆中找到最大值和最小值,需要的时间是O(logk),要遍历长度为n的所有k个数组(在最坏的情况下),时间复杂度是O(n*k),那么总时间复杂度是O(n*k*logk)。
    • 空间复杂性: 好的。 优先级队列将存储k个元素,因此空间复杂度为O(k)

本文由 阿迪蒂亚·戈尔 .如果你喜欢GeekSforgek,并想贡献自己的力量,你也可以写一篇文章,然后将文章邮寄给评论-team@geeksforgeeks.org.看到你的文章出现在Geeksforgeks主页上,并帮助其他极客。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写评论

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享