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 ...
随机推荐
- mysql 统计按天、星期、按月数据的各种 sql 语句 (转录)
文章主要是作为知识整理,内容略有修改,方便以后查阅,内容转摘至 陈宇衡的个人博客,欢迎前去围观. 作为演示效果,先创建一个测试表,在插入两条数据(注:时间为 datetime 类型,unix 时间戳需 ...
- commons.dbutils 的使用列子
c0p3的导入请参考前文 https://www.cnblogs.com/appium/p/10183016.html JdbcUtils: package cn.itcast.jdbc; impor ...
- 在vue中,让表格td下的textraea自适应高度
1.效果图 2.数据是动态获取的,因此存在一个异步的问题,解决的思路是数据获取到渲染在textarea中以后,获取文字的真实高度,然后把这个高度给textarea 3.具体代码以及步骤 (1)再cre ...
- Python 集合 day3
集合(set)是一个无序的不重复元素序列. 可以使用大括号 { } 或者 set() 函数创建集合,集合用{},里面是一个一个元素,不同于key-value形式的字典: 注意:创建一个空集合必须用 s ...
- js 中this到底指向哪里?
其实js的this指向很简单.我们记住下面3种情况. this 指向的是浏览器中的window.代码如下: function fn(){ this.name='yangkun'; this.age=2 ...
- SOA案例架构分析浅谈
上课中讲到了SOA架构设计,自己在课下决定总结一下对于SOA架构的理解以及应用. 先总结一下SOA的定义,SOA是面向服务架构,它可以根据需求通过网络对松散耦合的粗粒度应用组件进行分布式部署.组合和使 ...
- NYIST 914 Yougth的最大化
Yougth的最大化时间限制:1000 ms | 内存限制:65535 KB难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? ...
- orcale 基本查询(1)
orcale 基本查询 查询当前用户下的所有表: select * from tab; 查询表结构: desc 表名设置行宽: set linesize 120;设置列宽: 数值类型: col 列名 ...
- 楼控-西门子-insight使用-软件重新授权
在insight的使用中,可能会碰到insight的软件授权失败,此时需要重新将原授权删除,再重新将软件授权. 先看一下软件授权失效会出现什么: 再看看如何删除原来的密钥,再注册新的密钥.
- Eclipse没有Run On Server的问题解决
1.[项目]->[右击]->[Properties]->[Project Facets]->[Modify Project],选择[Java]和[Dynamic Web Mod ...