699. Falling Squares
On an infinite number line (x-axis), we drop given squares in the order they are given.
The i-th square dropped (positions[i] = (left, side_length)) is a square with the left-most point being positions[i][0] and sidelength positions[i][1].
The square is dropped with the bottom edge parallel to the number line, and from a higher height than all currently landed squares. We wait for each square to stick before dropping the next.
The squares are infinitely sticky on their bottom edge, and will remain fixed to any positive length surface they touch (either the number line or another square). Squares dropped adjacent to each other will not stick together prematurely.
Return a list ans of heights. Each height ans[i] represents the current highest height of any square we have dropped, after dropping squares represented by positions[0], positions[1], ..., positions[i].
Example 1:
Input: [[1, 2], [2, 3], [6, 1]]
Output: [2, 5, 5]
Explanation:
After the first drop of positions[0] = [1, 2]: _aa _aa ------- The maximum height of any square is 2.
After the second drop of positions[1] = [2, 3]: __aaa __aaa __aaa _aa__ _aa__ -------------- The maximum height of any square is 5. The larger square stays on top of the smaller square despite where its center of gravity is, because squares are infinitely sticky on their bottom edge.
After the third drop of positions[1] = [6, 1]: __aaa __aaa __aaa _aa _aa___a -------------- The maximum height of any square is still 5. Thus, we return an answer of [2, 5, 5].
Example 2:
Input: [[100, 100], [200, 100]]
Output: [100, 100]
Explanation: Adjacent squares don't get stuck prematurely - only their bottom edge can stick to surfaces.
Note:
1 <= positions.length <= 1000.1 <= positions[i][0] <= 10^8.1 <= positions[i][1] <= 10^6.
Approach #1: C++. [Brute Force]
class Solution {
public:
vector<int> fallingSquares(vector<pair<int, int>>& positions) {
vector<int> ans;
vector<Interval> intervals;
int maxHeight = INT_MIN;
for (const auto& it : positions) {
int start = it.first;
int end = start + it.second;
int baseHeight = 0;
for (const auto& it : intervals) {
if (start >= it.end || end <= it.start) {
continue;
}
baseHeight = max(baseHeight, it.height);
}
int height = it.second + baseHeight;
maxHeight = max(maxHeight, height);
intervals.push_back(Interval(start, end, height));
ans.push_back(maxHeight);
}
return ans;
}
private:
struct Interval {
int start;
int end;
int height;
Interval(int start, int end, int height)
: start(start), end(end), height(height) {}
};
};
Approach #2: C++. [Using Map]
class Solution {
public:
vector<int> fallingSquares(vector<pair<int, int>>& positions) {
vector<int> ans;
map<pair<int, int>, int> b;
int maxHeight = INT_MIN;
for (const auto& kv : positions) {
int start = kv.first;
int size = kv.second;
int end = start + size;
auto it = b.upper_bound({start, end});
if (it != b.begin()) {
auto it2 = it;
if ((--it2)->first.second > start)
it = it2;
}
int baseHeight = 0;
vector<tuple<int, int, int>> ranges;
while (it != b.end() && it->first.first < end) {
const int s = it->first.first;
const int e = it->first.second;
const int h = it->second;
if (s < start) ranges.emplace_back(s, start, h);
if (e > end) ranges.emplace_back(end, e, h);
baseHeight = max(baseHeight, h);
it = b.erase(it);
}
int newHeight = size + baseHeight;
b[{start, end}] = newHeight;
for (const auto& range : ranges) {
b[{get<0>(range), get<1>(range)}] = get<2>(range);
}
maxHeight = max(maxHeight, newHeight);
ans.push_back(maxHeight);
}
return ans;
}
};
Notes:
Approach #3: Java. [segment tree]
class Solution {
public List<Integer> fallingSquares(int[][] positions) {
int n = positions.length;
Map<Integer, Integer> cc = coorCompression(positions);
int best = 0;
List<Integer> res = new ArrayList<>();
SegmentTree tree = new SegmentTree(cc.size());
for (int[] pos : positions) {
int L = cc.get(pos[0]);
int R = cc.get(pos[0] + pos[1] - 1);
int h = tree.query(L, R) + pos[1];
tree.update(L, R, h);
best = Math.max(best, h);
res.add(best);
}
return res;
}
private Map<Integer, Integer> coorCompression(int[][] positions) {
Set<Integer> set = new HashSet<>();
for (int[] pos : positions) {
set.add(pos[0]);
set.add(pos[0] + pos[1] - 1);
}
List<Integer> list = new ArrayList<>(set);
Collections.sort(list);
Map<Integer, Integer> map = new HashMap<>();
int t = 0;
for (int pos : list) map.put(pos, t++);
return map;
}
class SegmentTree {
int[] tree;
int N;
SegmentTree(int N) {
this.N = N;
int n = (1 << ((int) Math.ceil(Math.log(N) / Math.log(2)) + 1));
tree = new int[n];
}
public int query(int L, int R) {
return queryUtil(1, 0, N - 1, L, R);
}
private int queryUtil(int index, int s, int e, int L, int R) {
// out of range
if (s > e || s > R || e < L) {
return 0;
}
// [L, R] cover [s, e]
if (s >= L && e <= R) {
return tree[index];
}
// Overlapped
int mid = s + (e - s) / 2;
return Math.max(queryUtil(2 * index, s, mid, L, R), queryUtil(2 * index + 1, mid + 1, e, L, R));
}
public void update(int L, int R, int h) {
updateUtil(1, 0, N - 1, L, R, h);
}
private void updateUtil(int index, int s, int e, int L, int R, int h) {
// out of range
if (s > e || s > R || e < L) {
return;
}
tree[index] = Math.max(tree[index], h);
if (s != e) {
int mid = s + (e - s) / 2;
updateUtil(2 * index, s, mid, L, R, h);
updateUtil(2 * index + 1, mid + 1, e, L, R, h);
}
}
}
}
699. Falling Squares的更多相关文章
- 【leetcode】699. Falling Squares
题目如下: On an infinite number line (x-axis), we drop given squares in the order they are given. The i- ...
- leetcode 699. Falling Squares 线段树的实现
线段树实现.很多细节值得品味 都在注释里面了 class SegTree: def __init__(self,N,query_fn,update_fn): self.tree=[0]*(2*N+2) ...
- Falling Squares
2020-01-08 10:16:37 一.Falling squares 问题描述: 问题求解: 本题其实也是一条经典的区间问题,对于区间问题,往往可以使用map来进行区间的维护操作. class ...
- [LeetCode] Falling Squares 下落的方块
On an infinite number line (x-axis), we drop given squares in the order they are given. The i-th squ ...
- [Swift]LeetCode699. 掉落的方块 | Falling Squares
On an infinite number line (x-axis), we drop given squares in the order they are given. The i-th squ ...
- LeetCode699. Falling Squares
On an infinite number line (x-axis), we drop given squares in the order they are given. The i-th squ ...
- LeetCode All in One题解汇总(持续更新中...)
突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...
- leetcode 学习心得 (4)
645. Set Mismatch The set S originally contains numbers from 1 to n. But unfortunately, due to the d ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
随机推荐
- yhdsir@function:php
curl 获取页面信息 function curl_get_content($url){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $u ...
- spring-boot4代码
App.java package com.kfit; import org.springframework.boot.SpringApplication; import org.springframe ...
- HTML5模拟衣服撕扯效果
在线演示 本地下载
- Git core objects
Git core objects Core objects in git blob object tree object commit object Git low level commands gi ...
- Windows Server 2008 MS Office 操作 检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件失败,原因是出现以下错误: 80070005 拒绝访问。 (异常来自 HRESULT:0x80070005 (E_ACCESSDENIED))。
Make sure that you have Office runtime installed on the server. If you are using Windows Server 2008 ...
- C++中输出 位宽和小数点后位数 的控制
要用到这个头文件: <iomanip> setw(x) : 表示控制输出x的位宽 setprecision(x) :表示 控制输出小数点后 x 位 cout.precision(x): 表 ...
- deepin网络加速
0.进入控制中心里的“更新设置”,选择速度最快的镜像源(我的是阿里云)1.安装dnsmasq(命令:sudo aptitude install dnsmasq)2.以管理员权限打开gedit(命令:s ...
- 2013各大IT公司薪资标准
以此鼓励自己 :http://jinhua.19lou.com/forum-874-thread-115901362964023509-1-1.html 以下三个是老大级别的公司 [微软] 研 ...
- C++ string的查找函数和npos特殊值
STL中的string有6个查找函数: 1.find() 2.rfind() 从最后一个字符开始往前找. 3.find_first_of() 4.find_not_first_of() 5.find_ ...
- linux 使用总结
shell 简单的实现守护进程 单纯的使用 &命令 + ctrl+D退出终端 原理: 关闭终端有两种方式,一种是点叉,这时候,你关闭的是gnome-terminal这个进程,而Bash是它的子 ...