LeetCode Weekly Contest 18B
1. 496. Next Greater Element I
暴力的话,复杂度也就1000 * 1000 = 1e6, 在1s的时限内完全可以。
当然,有许多优化方法,利用stack维护递减序列的方法, 见这里http://bookshadow.com/weblog/2017/02/05/leetcode-next-greater-element-i/
2. 506. Relative Ranks
这个是水题,直接排序,处理一下边界问题,输出就可以。
class Solution {
public:
vector<string> findRelativeRanks(vector<int>& nums) {
int n = nums.size();
vector<int> a(n);
for (int i = ; i < n; i++) a[i] = i;
sort(a.begin(), a.end(), [&](int x, int y) {
return nums[x] > nums[y];
});
vector<string> res(n);
string b[] = {"Gold Medal", "Silver Medal", "Bronze Medal"};
for (int i = ; i < min(, n); i++) {
res[a[i] ] = b[i];
}
for (int i = ; i < n; i++) {
//stringstream ss;
//ss << i + 1;
res[a[i]] = to_string(i + );
}
return res;
}
};
3. 503. Next Greater Element II
a. 这题,暴力的话1e4 * 1e4 = 1e8, 卡时限,每次的运算也很简单, 在leetcode上面一般能过。
但是,应该寻找更优的方法。
b. 先说一下,我的蠢办法,我居然拿线段树去做了,复杂度nlognlogn,应该是这个吧!我用线段树维护区间的最大值,预先建立好线段树,使得查询任意区间的最大值都是logn,然后,对一个数,对剩下的区间进行二分查找,求满足第一个满足区间的最大值大于该数。可以ac。
我的代码,(写的有点多,有点杀鸡焉用牛刀的感觉,算是复习下线段树的写法,其实rmq,sparse table也可以满足要求)。
int a[];
vector<int> f;
int n;
void bt(int o, int l, int r) {
//cout << o << endl;
if(l == r) {
a[o] = f[l - ];
//cout << l - 1 << " " << f[l - 1] << endl;
} else {
int mid = (l + r) >> ;
bt(o * , l, mid);
bt(o * + , mid + , r);
a[o] = max(a[o * ], a[o * + ]);
}
//cout << o << " " << a[o] << endl;
}
int dx, dy;
//int cnt;
int ask(int o, int l, int r) {
//cout << o << " " << l << " " << r << endl;
//cnt++;
//if(cnt >= 5) return 0;
if(dx > dy) return INT_MIN;
if(r < dx || l > dy) return INT_MIN;
if(dx <= l && r <= dy) {
return a[o];
} else {
int mid = (l + r) >> ;
bool f1, f2;
int a1, a2;
f1 = f2 = ;
// if(mid <= dy) {
// f1 = 1;
// a1 = ask(o * 2, l, mid);
// }
// if(mid + 1 >= dx) {
// f2 = 1;
// a2 = ask(o * 2 + 1, mid + 1, r);
// }
a1 = ask(o * , l, mid);
a2 = ask(o * + , mid + , r);
int res = INT_MIN;
//if(f1) res = max(res, a1);
//if(f2) res = max(res, a2);
res = max(a1, a2);
return res;
}
}
int work(int tar, int left, int right) {
int p = left;
while(left < right) {
int mid = (left + right) / ;
dx = p, dy = mid;
int t = ask(, , n);
if(t > tar) {
right = mid;
} else {
left = mid + ;
}
}
dx = p, dy = left;
return ask(, , n);
}
vector<int> nextGreaterElements(vector<int>& nums) {
f = nums;
n = nums.size();
bt(, , n);
vector<int> res(n);
//cout << "asd" << endl;
for (int i = ; i <= n; i++) {
int tar = nums[i - ];
dx = i + , dy = n;
int x = ask(, , n);
//cout << x << endl;
//return res;
dx = , dy = i - ;
int y = ask(, , n);
cout << x << " " << y << endl; if(x > tar) {
res[i - ] = work(tar, i + , n);
} else if(y > tar) {
res[i - ] = work(tar, , i - );
} else {
res[i - ] = -;
}
cout << i << endl;
//return res;
}
return res;
}
c. 这个题跟第一题差不多,其实还是稍微不同的,一种是利用stack维护单调递减的性质,循环的解决办法,就是创建2倍的原数组长度,这应该算通用的解决办法。见这里:http://bookshadow.com/weblog/2017/02/05/leetcode-next-greater-element-ii/
其实,stack优化的题目,leetcode有一类这样的题目,这种解法不容易想出来,需要仔细分析性质,我不是很熟练,有时间练习学习一下。好像有好几道,反正不是很好做!
d. 还有一种解法,我看的排名第一的解法,利用这样的性质,用res[i]记录最后的结果,a[i]代表原数组,i < j, 我们计算res[i]的时候,如果i < j, a[j] <= a[i], 可以先计算出res[j], 然后怎么考虑使用res[j]进行优化,其实 j 到 res[j] 之间的数字可以直接跳过,我们可以不直接保存res[j], 而是保存res[j]的下标,利用这个下标进行跳转。可以利用这个性质,进行优化。复杂度分析:不会分析。
代码:
class Solution {
int n;
vector<int> a, f;
public:
int calc(int x)
{
int &ans = f[x];
if(ans >= -)
return ans;
if(ans == -)
return ans = -;
ans = -;
int y;
for(y = (x + ) % n; y != - && a[x] >= a[y]; y = calc(y));
return ans = y;
}
vector<int> nextGreaterElements(vector<int>& nums) {
a = nums; n = a.size();
f.resize(n, -);
vector<int> aa;
for(int i = ; i < n; i++)
{
calc(i);
if(f[i] == -) aa.push_back(-);
else aa.push_back(a[f[i]]);
}
return aa;
}
};
4. 498. Diagonal Traverse
我的做法是:使用辅助空间记录每一行的起始位置,注意一下方向和边界条件。
更好的做法是:空间复杂度O(1)的,http://bookshadow.com/weblog/2017/02/05/leetcode-diagonal-traverse/ 维护每次转移的坐标,代码速度很快!
LeetCode Weekly Contest 18B的更多相关文章
- LeetCode Weekly Contest 8
LeetCode Weekly Contest 8 415. Add Strings User Accepted: 765 User Tried: 822 Total Accepted: 789 To ...
- leetcode weekly contest 43
leetcode weekly contest 43 leetcode649. Dota2 Senate leetcode649.Dota2 Senate 思路: 模拟规则round by round ...
- LeetCode Weekly Contest 23
LeetCode Weekly Contest 23 1. Reverse String II Given a string and an integer k, you need to reverse ...
- Leetcode Weekly Contest 86
Weekly Contest 86 A:840. 矩阵中的幻方 3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等. 给定一个 ...
- LeetCode Weekly Contest
链接:https://leetcode.com/contest/leetcode-weekly-contest-33/ A.Longest Harmonious Subsequence 思路:hash ...
- 【LeetCode Weekly Contest 26 Q4】Split Array with Equal Sum
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/split-array-with-equal-sum/ ...
- 【LeetCode Weekly Contest 26 Q3】Friend Circles
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/friend-circles/ [题意] 告诉你任意两个 ...
- 【LeetCode Weekly Contest 26 Q2】Longest Uncommon Subsequence II
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...
- 【LeetCode Weekly Contest 26 Q1】Longest Uncommon Subsequence I
[题目链接]:https://leetcode.com/contest/leetcode-weekly-contest-26/problems/longest-uncommon-subsequence ...
随机推荐
- 微信小程序 请求超时处理
1.在app.json加入一句 "networkTimeout": { "request": 10000 } 设置超时时间,单位毫秒 2.请求 wx.reque ...
- 模拟登录新浪微博(Python)
PC 登录新浪微博时, 在客户端用js预先对用户名.密码都进行了加密, 而且在POST之前会GET 一组参数,这也将作为POST_DATA 的一部分. 这样, 就不能用通常的那种简单方法来模拟POST ...
- 数据结构实验病毒感染检测问题(C++)
医学研究者最近发现了某些新病毒,通过对这些病毒的分析,得知他们的DNA序列都是环状的.现在研究者已收集了大量的病毒DNA和人的DNA数据,想快速检测出这些人是否感染了相应的病毒.为了方便研究,研究者将 ...
- [luogu2461 SDOI2008] 递归数列 (矩阵乘法)
传送门 Description 一个由自然数组成的数列按下式定义: 对于i <= k:ai = bi 对于i > k: ai = c1ai-1 + c2ai-2 + ... + ckai- ...
- lucene_05_solr配置
什么是solr Solr.是Apache 下的一个顶级开源项目,采用Java 开发,它是基于Lucene 的全文搜索服务器.Solr 提供了比Lucene 更为丰富的查询语言,同时实现了可配置.可扩展 ...
- 暑假集训D14总结
%dalao 今天dalao继续来讲课~讲的是一个叫kd树的奇怪东西= = 然而啥都没听懂 考试 今天多校联考,日常炸= = 照例打了前两道题的暴力(T1随便hash一下就水过了啊喂),然后开始推T3 ...
- FADE:云存储中数据安全删除
FADE: Secure Overlay Cloud Storage with File Assured Deletion ,论文发表于SecureComm,C类. 香港大学的研究 ...
- 0929误删除innodb ibdata数据文件
今天在群里看到有人说不熟悉innodb把ibdata(数据文件)和ib_logfile(事务日志)文件误删除了.不知道怎么解决.当时我也不知道怎么办.后来查阅相关资料.终找到解决方法.其实恢复也挺简单 ...
- DJANGO之自定义模板过滤器
我查找了DJANGO模板的过滤器,好像指定字符串包含指定关-键字符的过滤器没有呢, 没有硬着头-皮,按网上其它人的作法,写了一个,成功了...:) 参考URL: http://liuzhijun.it ...
- ExpressionTreeVisualizer
看表达式的工具,这个工具后来微软不更新了,只支持到VS2013 表达式树的语法难度太大,语法和实现难度都大 相关文章 github地址