CSDN编程竞赛报名地址:https://edu.csdn.net/contest/detail/16
1.终于获奖了
终于我获奖了!!!
相信很多人了解CSDN在今年7月份(可能是6月份)的时候推出了一款每日一题的编程题的功能、与之呼应的就是编程竞赛模块。风格和使用的方法其实和主流的力扣啊,牛客平台的在线编程判题功能无异。
作为这个活动的老用户呢,在9月18号的CSDN编程竞赛-第六期中我终于薅到羊毛了!!!
2.老用户感言
编程竞赛自7月3日举办第一期,至今第六期了,我也完完整整的参加了5期,第五期去看我的好朋友『天上一捧秋月蓉』,所以没有参加。
讲一讲这五次参赛的体验吧。记得第一次和第二次在线判题好多的BUG,当时我记得网站给的输入输出函数的返回值都有问题,还是自己手动改的,而且当时我记得的最大的痛点就是比赛过程中我竟然不能复制粘贴自己写的代码。但是慢慢的BUG和用户体验都有优化,至少后面这几期我不用去检查输入输出函数了。而且禁止粘贴的功能也给予了20次的限度,还是很合理的。然后一点小建议就是,网页可以切屏20次感觉有点多,最多三次就可以判定用户作弊了,官方可以考虑一下。
3.参赛感受
最后谈一谈这次的题目吧。感觉就是太简单了,相比前几期这一期的题目有点水,居然让我这个菜鸡全做出来了。
然后简单的贴一下最后一题的代码吧,因为比赛的时候看错题了,卡了好久,以为自己时间复杂度太大了,在苦苦的优化,重看了题目才发现原来这么简单。
题目大意:最长递增的区间长度
给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3
当时读题以为是求最长递增子序列,结果我就啪啪啪的敲模板,两层for循环就解决了,结果哦吼,只过了30%。
//动态规划算法
for(int i=1;i<=n;++i) {
for(int j=1;j<=i-1;++j) {
if(num[j]<num[i]) {
dp[i]=Math.max(dp[j]+1, dp[i]);
}
}
}
//遍历找出dp数组中的最大值
int max=0;
for(int i=1;i<=n;++i) {
max=Math.max(max, dp[i]);
}
以为是时间复杂度的原因,我又修修改改,写了个二分查找优化,提交直接wa的一下反而只通过20%了。
for(int i=1;i<=n;++i) {
//如果第一个大于a[i]的元素是c数组的最后一个元素
//就直接将a[i]添加在c数组的后面)
if(a[i]>c[cl]) {
c[++cl]=a[i];
b[cl]=cl;
}else {
int low=1,high=i;
while(low<=high) {
int mid=(low+high)/2;
if(c[mid]<a[i]) {low=mid+1;}
else {high=mid-1;}
}
//二分查找找到c数组中第一个大于a[i]的元素,然后更新它的值
c[low]=a[i];
}
}
再一看题,栓Q,题目都没看仔细。找的是最长连续递增子序列,根本就不需要考虑寿命时间复杂度,一个for循环就能解决。dp[]数组维护最长连续子序列的长度,初始值是1,一个for循环遍历,如果后者(a[i+1])比当前的数(a[i])大,则dp[i+1]=dp[i]+1
,如果小的话,就不满足连续了,前面dp[]记录的状态(最长值)就不管用了。所以这时dp[i+1]=1
public static int solution(int n, ArrayList<Integer> arr){
int result = 1;
int[] dp=new int[n+1];
for(int i=0;i<n;++i){
dp[i]=1;
}
for(int i=0;i<n-1;++i){
if(arr.get(i+1)>arr.get(i))dp[i+1]=dp[i]+1;
if(dp[i+1]>result)result=dp[i+1];
}
return result;
}
}
4.彩虹屁
最后希望CSDN越办越好吧,自己在CSDN真的成长学习了很多,也薅到了不少奖品,认识了很多的前辈。希望越来越多的人参与到CSDN的活动中来,也希望自己越来越强大。