2018.2.17–双指针、kaggle入门
双指针
广义上的双指针,是利用问题本身与序列的特性,使用两个下标i、j
对序列进行扫描,以较低的复杂度解决问题,一般是O(n)
。
例如,在于给定的一个递增的正整数序列和一个正整数M,求数列中两个不同的位置的数a和b,使他们的和恰好为M,输出所有满足的答案。
对于这个问题,使用二重循环枚举序列中的数,是比较直接的思路,但是,时间复试度为O(n*2)
但是,使用双指针可以将时间复杂度降低到O(n)
,代码如下:
while(i<j){//i = 0, j = n-1
if(a[i]+a[j]==m){
printf("%d %d\n",i,j);
i++;
j--;
} else if(a[i]+a[j]<m) {
i++;
} else if(a[i]+a[j]>m){
j--;
}
}
这种思路跟我们合并递增序列的思路是一致的。
int merge(int A[],int B[],int C[],int n,int m)
{
int i = 0, j = 0, index = 0;
while(i < n && j < m)
{
if(A[i]<=B[i])
{
C[index++] = A[i++];
}
else
{
C[index++] = B[j++];
}
}
while(i < n)
C[index++] = A[i++];
while(j < m)
C[index++] = B[j++];
return index;
}
kaggle竞赛
今天大致了解了一个比赛的赛制,以及参赛的须知,准备在考研面试之前完成kaggle的入门赛题titanic,为自己的复试加点分。
Titanic: Machine Learning from Disaster
非常感谢 Linghao Zhang 同学写的Kaggle 入门指南,受益匪浅。
推荐刚刚起步的同学先去了解一下
今天事情比较多,溜了溜了