笔试算法

"笔试算法总结"

Posted by jhljx on September 6, 2016

目录

笔记常见算法题整理

京东一个环,满足条件的对

猿题库 求出连续子数组之和为0

腾讯 区间二分[-90,90]

数组分成两个子数组,子数组和的差值绝对值最小 背包

数组分成两个子数组,子数组的平均值差值绝对值最大 排序

降序数组重排

#include<cstdio>
#include<queue>
using namespace std;

int a[1000010],n;

int main(){

    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
            a[i]=n-i+1;
        }
        int i=1,j=n,k=0;
        deque<int> q;
        int res=0;
        while(i<=j){
            if(!k){
                q.push_back(a[i]);
                int sz=q.size();
                res=max(res,sz);
                a[i]=a[j];
                i++,j--;
            }else{
                int top=q.front();
                q.pop_front();
                int tmp=a[i];
                a[i]=top;
                q.push_back(tmp);
                int sz=q.size();
                res=max(res,sz);
                i++;
            }
            k=k^1;
        }
        if(a[i-1]==q.back()) q.pop_back();
        while(!q.empty()){
            if(!k){
                int top=q.back();
                q.pop_back();
                a[i]=top;
                i++,k=k^1;
            }else{
                int top=q.front();
                q.pop_front();
                a[i]=top;
                i++,k=k^1;
            }
        }
        for(int i=1;i<=n;i++){
            printf("%d ",a[i]);
        }
        printf("\n");
    }
}

时间复杂度O(n),空间复杂度O(1)。

#include<cstdio>
using namespace std;

const int maxn=100010;
int n,a[maxn];

int main(){

    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
            a[i]=n-i+1;
        }
        for(int i=1;i<=n;i++){
            if(a[i]>n) continue;
            else{
                int k=i,j=-1,tmp=a[i]+n;
                tmp-=n;
                if(tmp>(n+1)/2) j=2*(n-tmp+1);
                else j=2*tmp-1;
                int num=a[j];
                a[j]=tmp+n;
                tmp=num+n;
                k=j;
                while(k!=i){
                    tmp-=n;
                    if(tmp>(n+1)/2) j=2*(n-tmp+1);
                    else j=2*tmp-1;
                    num=a[j];
                    a[j]=tmp+n;
                    tmp=num+n;
                    k=j;
                }
            }
        }
        for(int i=1;i<=n;i++){
            printf("%d ",a[i]-n);
        }
        printf("\n");
    }
}

N*N矩阵求出M*M子矩阵的中位数(最大子矩阵和,最大全1子矩阵)

二维线段树? http://blog.csdn.net/zxy_snow/article/details/6264135

http://blog.jobbole.com/98565/