acm刷题记录(2020.3.12)

leetcode 4
寻找两个有序数组的中位数
在这里插入图片描述
这题的思路类似归并排序,设k为两个数组长度和,找中位数等于找第k/2和(k+1)/2两个数。
在算法中学过查找两个有序数组的第K小元素,可以采用二分的思想。
找取p=k/2时 数组nums1和nums2的第p个元素。
若 nums1[p]>nums2[p] ,则说明nums2前面p个元素都不是第k小元素。
于是可以把数组b的前p个元素舍去,将k=k-p;
在实现时可以采用地柜的方法,类似于二分。

code:

class Solution {
    public int get(int[] nums1,int n1,int s1,int[] nums2,int n2,int s2,int k)
    {
        int len1=n1-s1+1;
        int len2=n2-s2+1;
        if(len1>len2) return get(nums2,n2,s2,nums1,n1,s1,k);
        if(len1==0) return nums2[s2+k-1];
        
        if(k==1) return Math.min(nums1[s1],nums2[s2]);
        int x1=s1 + Math.min(len1,k/2)-1;
        int x2=s2 + Math.min(len2,k/2)-1;
        if(nums1[x1]>nums2[x2]) return get(nums1,n1,s1,nums2,n2,x2+1,k-(x2+1-s2));
        else return get(nums1,n1,x1+1,nums2,n2,s2,k-(x1+1-s1));
    }
    public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    int n1=nums1.length;
    int n2=nums2.length;
    int m1=(n1+n2+1)/2;
    int m2=(n1+n2+2)/2;
    return (get(nums1,n1-1,0,nums2,n2-1,0,m1)+get(nums1,n1-1,0,nums2,n2-1,0,m2))*0.5;
  }
}

在这里插入图片描述

leetcode 5
最长回文子串
在这里插入图片描述
此题最简单思路是 对于任一字符其前字符等于后一字符,或者后一字符与其相等,则是回文串。
即:存在s[n],if s[n-1]==s[n+1] or s[n]=s[n=1] then s[n-1,n+1] or s[n,n+1]是回文串
根据这个思路 遍历所有字符 即可得出最长回文子串。

code:

class Solution {
    public String longestPalindrome(String s) {
        int len = s.length();
        if(len == 0) return "";
        int max=0;
        int r=0;
        int l=0;
        for(int i=0;i<len-1;i++)
        {
                int p=2;
                int j=i;
                for(;j<len-1;j++)
                {
                    if(s.charAt(i)==s.charAt(j+1))
                    {
                        p++;
                        if(p>max)
                        {
                        l=i;
                        r=j+1;
                        max=p;
                        }
                    }
                    else break;
                }
                for(int k=1;i-k>=0&&j+k<len;k++)
                {
                    if(s.charAt(i-k)==s.charAt(j+k))
                    {
                        p+=2;
                        if(p>max)
                        {
                        l=i-k;
                        r=j+k;
                        max=p;
                        }
                    }
                    else  break;
                }
        }
        return s.substring(l,r+1);
    }
}

在这里插入图片描述

稍微改进一点若判断过连续字符则下一次从不连续字符开始。

class Solution {
    public String longestPalindrome(String s) {
        int len = s.length();
        if(len == 0) return "";
        int max=0;
        int r=0;
        int l=0;
        for(int i=0;i<len-1;i++)
        {
                int p=2;
                int j=i;
                for(;j<len-1;j++)
                {
                    if(s.charAt(i)==s.charAt(j+1))
                    {
                        p++;
                        if(p>max)
                        {
                        l=i;
                        r=j+1;
                        max=p;
                        }
                    }
                    else break;
                }
                for(int k=1;i-k>=0&&j+k<len;k++)
                {
                    if(s.charAt(i-k)==s.charAt(j+k))
                    {
                        p+=2;
                        if(p>max)
                        {
                        l=i-k;
                        r=j+k;
                        max=p;
                        }
                    }
                    else  break;
                }
                i=j;
        }
        return s.substring(l,r+1);
    }
}

在这里插入图片描述
leetcode 6
Z 字形变换
在这里插入图片描述
简单思路:
根据z字型顺序,逐步将字符拼接到每一层的字符串中,但空间开销大
code:

class Solution {
    public String convert(String s, int numRows) {
    if(numRows==1) return s;
    StringBuilder [] sl=new StringBuilder[numRows];
    for(int i=0;i<numRows;i++)
    {
        sl[i]=new StringBuilder();
    }
    boolean k=true;
    int p=0;
    for(int i=0;i<s.length();i++)
    {
        if(k==true)
        {
            sl[p].append(s.charAt(i));
            p++;
            if(p==numRows-1) k=false;
        }
        else
        {
            sl[p].append(s.charAt(i));
            p--;
            if(p==0) k=true;
        }
    }
    StringBuilder sp=new StringBuilder();
    for(int i=0;i<numRows;i++)
    {
        sp.append(sl[i]);
    }
    return new String(sp);
    }
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值