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 ...
随机推荐
- dubbo之集群容错
在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试. 集群容错模式 1. Failover Cluster 失败自动切换,当出现失败,重试其它服务器 .通常用于读操作,但 ...
- Morse理论:拓扑不变性特征匹配原理
设计精美的宽基线双目相机镇文 Mo'ersi lilun莫尔斯理论(卷名:数学) Morse theory 微分拓扑的一个重要分支.通常是指两部分内容:一部分是微分流形上可微函数的莫尔斯理论,即临界点 ...
- java中负数的补码转换为十进制
一个数如果为正,则它的原码.反码.补码相同:一个正数的补码,将其转化为十进制,可以直接转换. 已知一个负数的补码,将其转换为十进制数,步骤: 1.先对各位取反: 2.将其转换为十进制数: 3.加上负号 ...
- js 验证文件格式和大小
<script> $('#btnSearch').click(function(){ // alert("000");// fileElem = document.ge ...
- Jenkins 定时 构建项目
选择要定时构建的 项目-->配置-->构建触发器 触发项目: Poll SCM:定时检查源码变更(根据SCM软件的版本号),如果有更新就checkout最新code下来,然后执行构建动作. ...
- Apex语言(三)原始数据类型
1.原始数据类型(Primitive) 整数:Integer 双精度:Double 单精度:Decimal 长整型:Long 日期:Date 日期时间:Datetime 字符串:String ID:I ...
- day008 字符编码之 字符编码 、Python2和Python3字符编码的区别
计算机基础(掌握) 启动应用程序的流程 双击qq 操作系统接受指令然后把该操作转化为0和1发送给CPU CPU接受指令然后把指令发送给内存 内存接受指令把指令发送给硬盘获取数据 qq在内存中运行 文本 ...
- Python匿名函数/排序函数/过滤函数/映射函数/递归/二分法
一. lamda匿名函数 为了解决一些简单的需求而设计的一句话函数 # 计算n的n次方 def func(n): return n**n print(func(10)) f = lambda n: n ...
- Python之CSV模块
1. CSV简介 CSV(Comma Separated Values)是逗号分隔符文本格式,常用于Excel和数据库的导入和导出,Python标准库的CSV模块提供了读取和写入CSV格式文件的对象. ...
- windows 2003一个网卡绑定多个IP地址
1.打开“网络连接”,选中需要添加多个IP的“本地连接”-->右键-->“属性”: 2.从“常规”中找到“Internet 协议(TCP/IP)属性”: 3.选择手动设置IP地址.网关.掩 ...