[LeetCode6. ZigZag Conversion]From O(n^2) To O(n)

这题好久以前就尝试去做过,今天拿到依然没思路。想了几分钟又有思路了,直接把每个字母在哪一层用数组保存起来就好了,接着就用了双重循环枚举得到结果,时间复杂度是O(N*numRows),空间复杂度是O(n);又想了一想,既然每个元素的层次已经确定了,为什么不一遍填到结果字符串里面去呢,然后就又开了一个数组,存储每一层所有元素的个数,在用一个循环使得每一层的值保存到前面所有元素的和,这样就能把每个字符直接填到自己的位置上了。下面是代码:

 string convert(string s, int num) {
        if(num==1)  return s;
        int n=s.size();
        vector<int> res(n,0);
        vector<int> lev(num+1,0);
        int p=1,f=0;
        for(int i=0;i<n;i++){
            res[i] = p;
            lev[p]++;//lev[p]保存p行的元素个数
            if(!f)  p++;
            if(f)   p--;
            if(p==1)    f=0;
            if(p==num)  f=1;
        }
        //还需把lev【p】的含义变为p层之前的元素个数总和
        int sum=0;
        for(int i=0;i<=num;i++){
            sum+=lev[i];
            lev[i] = sum;
        }
        string ans(s);       
        for(int i=0;i<n;i++){
           ans[lev[res[i]-1]++] = s[i];
        }        
        return ans;
    }

猜你喜欢

转载自blog.csdn.net/Csdn_jey/article/details/88945459