LeetCode #2#3#5#6#7

2 Add Two Numbers

Solution:

  • 指针的简单操作

3 Longest Substring Without Repeating Characters

Solution:

  • 开个bool数组记录下每个字符最晚出现的时间点a[s[i]],开个变量作为前一次冲突出现的时间戳k,扫一遍整个串边维护边更新最优值就好了ans=max(ans,i-max(a[s[i]],k-1)。O(n)

5 Longest Palindromic Substring

Solution:

  • 枚举每一位为中间点分奇偶向两边扩散,O(n^2)。
  • 有一种叫做manacher算法的东西,稍微利用对称性就可以O(n)求回文串了,很简单,具体做法可以百度一下,很多详解。
  • //写完回来发现这篇的水题包可讲解的东西太少,所以稍微说下manacher吧。
  • 首先在串的每个字符间增加一个无意义字符如’#’,这样不需要考虑原串长度为偶数的回文串了。
  • 那么取f[i]表示以i为中心的最长回文子串长度(长度是串长一半,即该串为i-f[i]~i+f[i])
  • 当前要求f[j]了,假设i点为形如i+f[i]式子值中的最大值(i为1~j-1范围),则f[j]一定程度上依赖i+f[i]。
  • 若i+f[i]>j,由对称性可得f[j]至少为min(f[2*i-j],f[i]+i-j)
  • 否则,f[j]至少为1。
  • 而后,扩一扩试试看f[j]还能不能更大。
  • 这种做法可以保证O(n)是显然的,向右扩展最多只会到n,保证了不会有重复的扩展发生。
  • 至于对称性那一步的具体过程,纸上稍微画画就明白了,提示:f[2*i-j]—>f[i-(i-j)] f[i]+i-j—> (f[i]+i)-j

6 ZigZag Conversion

Solution:

        for (int i=1;i<=numRows;i++)
        {
            int j;
            if (i==1||i==numRows)
            {
                j=i-1;
                while (j<len)
                {
                    ans+=s[j]; j=j+n-1+n-2+1;
                }
            } else
            {
                bool p=true;
                j=i-1;
                while (j<len)
                {
                    ans+=s[j]; 
                    if (p) {j=j+n-i+n-i-1+1; p=false;} else
                           {j=j+i-1+i-1; p=true;}
                }
            }
        }
  • 奇怪的映射题目。不要忘记如果n=1输出原串- -

7 Reverse Integer

Solution:

  • 坑点在于,如果翻过来不在int范围要输出0哟。
  • 保持只使用int的话,不是特别好写。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值