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 ...
随机推荐
- OpenCV:OpenCV中的 parallel_for 和opencv parallel_for_
OpenCV使用OMP完成并行运算,在使用AdaBoost检测的时候,在cascadedetect.cpp 里面,大量使用 parallel_for_(Range(0, stripCount), Ca ...
- 【sqli-labs】 less11 POST - Error Based - Single quotes- String (基于错误的POST单引号字符型注入)
查看源码,用户名和密码通过post提交 加单引号提交 出现报错,推测对应的SQL语句 , 直接使用or构造永真登录 成功,注意此处登录的用户为表中的第一个用户 需要改变用户可以通过改变筛选条件实现 作 ...
- js document 触发按键事件
// 键盘控制 var keyEvent = (function () { document.onkeydown = function (e) { if (e.keyCode === 38) { // ...
- spring 回顾
主要就是它的IOC理念 即:把对象的创建.初始化.销毁等工作交给spring容器来做 依赖jar
- 【剑指Offer】62、二叉搜索树的第k个结点
题目描述: 给定一棵二叉搜索树,请找出其中的第k小的结点.例如(5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 解题思路: 本题实际上比较简单,主要还是考察对 ...
- CentOS7.2安装nginx失败
错误提示: Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile * base: mirrors.aliyu ...
- 2019-04-02 cast and covert
convert 专用于SQLServer,cast对于其它数据库的兼容性更好 convert 处理日期和时间值更厉害 语法不一样: cast(itemvalue as decimal(19,6)) c ...
- 渗透实战(周四):CSRF跨站域请求伪造
上图是广东外语外贸大学北校区内MBA中心旁边酒店房间的Wi-Fi网络环境,假设我们的Kali攻击机连入到SSID为414(房间号)的Wi-Fi网络,其IP地址:192.168.43.80 .同一Wi- ...
- 15.Hibernate一对多双向关联映射+分页
1.创建如下数据库脚本 --创建用户信息表 --编号,用户名,密码,年龄,性别,昵称,手机,地址,管理员,图像地址 create table users ( id ) primary key, use ...
- web开发如何使用高德地图API(二)结合输入提示和POI搜索插件
说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...