632. Smallest Range(priority_queue)
You have k
lists of sorted integers in ascending order. Find the smallest range that includes at least one number from each of the k
lists.
We define the range [a,b] is smaller than range [c,d] if b-a < d-c
or a < c
if b-a == d-c
.
Example 1:
Input:[[4,10,15,24,26], [0,9,12,20], [5,18,22,30]]
Output: [20,24]
Explanation:
List 1: [4, 10, 15, 24,26], 24 is in range [20,24].
List 2: [0, 9, 12, 20], 20 is in range [20,24].
List 3: [5, 18, 22, 30], 22 is in range [20,24].
Note:
- The given list may contain duplicates, so ascending order means >= here.
- 1 <=
k
<= 3500 - -105 <=
value of elements
<= 105. - For Java users, please note that the input type has been changed to List<List<Integer>>. And after you reset the code template, you'll see this point.
Approach #1: C++. [Using pointers]
class Solution {
public:
vector<int> smallestRange(vector<vector<int>>& nums) {
int size = nums.size();
vector<int> next(size, 0);
int minx = 0, miny = INT_MAX;
bool flag = true;
for (int i = 0; i < size && flag; ++i) {
for (int j = 0; j < nums[i].size() && flag; ++j) {
int min_i = 0, max_i = 0;
for (int k = 0; k < size; ++k) {
if (nums[min_i][next[min_i]] > nums[k][next[k]])
min_i = k;
if (nums[max_i][next[max_i]] < nums[k][next[k]])
max_i = k;
}
if (miny - minx > nums[max_i][next[max_i]] - nums[min_i][next[min_i]]) {
miny = nums[max_i][next[max_i]];
minx = nums[min_i][next[min_i]];
}
next[min_i]++;
if (next[min_i] == nums[min_i].size())
flag = false;
}
}
return {minx, miny};
}
};
Approach #2: Java. [Using pointers and priorityQueue]
class Solution {
public int[] smallestRange(List<List<Integer>> nums) {
int minx = 0, miny = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
int[] next = new int[nums.length];
boolean flag = true;
PriorityQueue<Integer> min_queue = new PriorityQueue<Integer>((i, j)->nums[i][next[i]] - nums[j][next[j]]);
for (int i = 0; i < nums.length; ++i) {
min_queue.offer(i);
max = Math.max(max, nums[i][0]);
}
for (int i = 0; i < nums.length && flag; ++i) {
for (int j = 0; j < nums[i].length && flag; ++j) {
int min_i = min_queue.poll();
if (miny - minx > max - nums[min_i][next[min_i]]) {
minx = nums[min_i][next[min_i]];
miny = max;
}
next[min_i]++;
if (next[min_i] == nums[min_i].length) {
flag = false;
break;
}
min_queue.offer(min_i);
max = Math.max(max, nums[min_i][next[min_i]]);
}
}
return new int[] {minx, miny};
}
}
I can't understand why it always compile error with this prompt: Line 10: error: cannot find symbol: method length().
This is the C++ version using priority_queue to solve this problem, may be it can understand easily.
#include <vector>
#include <queue>
#include <limits> using namespace std; struct Item {
int val;
int r;
int c; Item(int val, int r, int c): val(val), r(r), c(c) {
}
}; struct Comp {
bool operator() (const Item& it1, const Item& it2) {
return it2.val < it1.val;
}
}; class Solution {
public:
vector<int> smallestRange(vector<vector<int>>& nums) {
priority_queue<Item, vector<Item>, Comp> pq; int high = numeric_limits<int>::min();
int n = nums.size();
for (int i = 0; i < n; ++i) {
pq.push(Item(nums[i][0], i, 0));
high = max(high , nums[i][0]);
}
int low = pq.top().val; vector<int> res{low, high}; while (pq.size() == (size_t)n) {
auto it = pq.top();
pq.pop(); if ((size_t)it.c + 1 < nums[it.r].size()) {
pq.push(Item(nums[it.r][it.c + 1], it.r, it.c + 1));
high = max(high, nums[it.r][it.c + 1]);
low = pq.top().val;
if (high - low < res[1] - res[0]) {
res[0] = low;
res[1] = high;
}
}
} return res;
}
};
Approach #3: Python.
class Solution(object):
def smallestRange(self, A):
"""
:type nums: List[List[int]]
:rtype: List[int]
"""
pq = [(row[0], i, 0) for i, row in enumerate(A)]
heapq.heapify(pq) ans = -1e9, 1e9 right = max(row[0] for row in A)
while pq:
left, i, j = heapq.heappop(pq)
if right - left < ans[1] - ans[0]:
ans = left, right
if j + 1 == len(A[i]):
return ans
v = A[i][j+1]
right = max(right, v)
heapq.heappush(pq, (v, i, j+1))
Time Submitted | Status | Runtime | Language |
---|---|---|---|
a few seconds ago | Accepted | 156 ms | python |
3 hours ago | Accepted | 1644 ms | cpp |
Analysis:
In the second approach this statement make me confused.
PriorityQueue < Integer > min_queue = new PriorityQueue < Integer > ((i, j) -> nums[i][next[i]] - nums[j][next[j]]);
may be it can sort automatically in the PriorityQueue function.
C++ ------> priorityqueue:
Priority Queue in C++ Standard Template Library (STL)
Priority queues are a type of container adapters, specifically designed such that the first element of the queue is the greatest of all elements in the queue and elements are in non decreasing order(hence we can see that each element of the queue has a priority{fixed order}).
The functions associated with priority queue are:
empty() – Returns whether the queue is empty
size() – Returns the size of the queue
top() – Returns a reference to the top most element of the queue
push(g) – Adds the element ‘g’ at the end of the queue
pop() – Deletes the first element of the queue
#include <iostream>
#include <queue> using namespace std; void showpq(priority_queue <int> gq)
{
priority_queue <int> g = gq;
while (!g.empty())
{
cout << '\t' << g.top();
g.pop();
}
cout << '\n';
} int main ()
{
priority_queue <int> gquiz;
gquiz.push(10);
gquiz.push(30);
gquiz.push(20);
gquiz.push(5);
gquiz.push(1); cout << "The priority queue gquiz is : ";
showpq(gquiz); cout << "\ngquiz.size() : " << gquiz.size();
cout << "\ngquiz.top() : " << gquiz.top(); cout << "\ngquiz.pop() : ";
gquiz.pop();
showpq(gquiz); return 0;
}
come from : https://www.geeksforgeeks.org/priority-queue-in-cpp-stl/
632. Smallest Range(priority_queue)的更多相关文章
- [LeetCode] 632. Smallest Range Covering Elements from K Lists 覆盖K个列表元素的最小区间
You have k lists of sorted integers in ascending order. Find the smallest range that includes at lea ...
- [leetcode]632. Smallest Range最小范围
You have k lists of sorted integers in ascending order. Find the smallest range that includes at lea ...
- 【LeetCode】632. Smallest Range 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/smallest ...
- [LeetCode] Smallest Range 最小的范围
You have k lists of sorted integers in ascending order. Find the smallest range that includes at lea ...
- [Swift]LeetCode632. 最小区间 | Smallest Range
You have k lists of sorted integers in ascending order. Find the smallest range that includes at lea ...
- 一道题目- Find the smallest range that includes at least one number from each of the k lists
You have k lists of sorted integers. Find the smallest range that includes at least one number from ...
- [LeetCode] 910. Smallest Range II 最小区间之二
Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and ad ...
- [LeetCode] 908. Smallest Range I 最小区间
Given an array A of integers, for each integer A[i] we may choose any x with -K <= x <= K, and ...
- 【Leetcode_easy】908. Smallest Range I
problem 908. Smallest Range I solution: class Solution { public: int smallestRangeI(vector<int> ...
随机推荐
- Data Matrix Font and Encoder条码控件可以以字体的形式来打印DataMatrix条形码
Data Matrix Font and Encoder条码控件使您能够以字体的形式来打印DataMatrix条形码. 本产品能够在不论什么支持Java类库..NET动态链接库或Windows COM ...
- Python list 和 str 互转
一.list转字符串 命令:''.join(list)其中,引号中是字符之间的分割符,如“,”,“;”,“\t”等等如:list = [1, 2, 3, 4, 5]''.join(list) 结果即为 ...
- iphone开发的技巧
一,改动状态栏: 1.增加[[UIApplication sharedApplication] setStatusBarHidden:YES animated:NO];但此方法仅仅是不显示状态条,状态 ...
- 【BZOJ4296】[PA2015]Mistrzostwa BFS
[BZOJ4296][PA2015]Mistrzostwa Description 给定一张n个点m条边的无向图,请找到一个点数最多的点集S,满足:1.对于点集中任何一个点,它至少与d个点集中的点相邻 ...
- 2-3-4树的java实现
一.什么是2-3-4树 2-3-4树和红黑树一样,也是平衡树.只不过不是二叉树,它的子节点数目可以达到4个. 每个节点存储的数据项可以达到3个.名字中的2,3,4是指节点可能包含的子节点数目.具体而言 ...
- webstrom编辑react语法报错解决
问题: 解决办法:1.把 JavaScript 的版本设置为 JSX Harmony. 2.把<script>type类型改为:text/jsx
- SQL 关联操作
- Machine Learning in Action(2) 决策树算法
决策树也是有监督机器学习方法. 电影<无耻混蛋>里有一幕游戏,在德军小酒馆里有几个人在玩20问题游戏,游戏规则是一个设迷者在纸牌中抽出一个目标(可以是人,也可以是物),而猜谜者可以提问题, ...
- atol的实现【转】
本文转载自:http://blog.csdn.net/cwqbuptcwqbupt/article/details/7518582 看了atol的实现,发现char到int的转换比较奇怪:c = (i ...
- 坡道定点停车30cm
坡道定点停车与起步是科目二五项必考之一,想要顺利通过该项考试,学员需要掌握两个要点,一个是车身距离右侧边线30cm以内的距离,一个是定点时机.本期,元贝小编先和大家分享半坡起步右边30公分怎么看. ...