刷爆力扣的第二天(lc04,lc05,lc06)

        为了加快我的刷题速度,解题思想都加入到代码中了,如果有需要的小伙伴可以自行查看噢,我的方法未必是最好的方法,但一定是最容易理解的方法,如果对你有帮助,请记得帮我点赞收藏噢,希望我的方法能得到你们的认可~

1.lc04

题目

思路

        本题思路非常简单,由于我们目的还是为了能够提升我们迅速解决题目的能力,该题最直接的想法就是创建一个能容纳两个数组的新数组,然后排序,取中间数即可。

解答

public double findMedianSortedArrays(int[] nums1, int[] nums2) {
    //选择使用最简单的想法
    //新建一个能容纳两个数组的新数组
    int m = nums1.length;
    int n = nums2.length;
    int[] num = new int[m + n];
    int i = 0;
    int j = 0;
    int k = 0;
    //将他们按照顺序填充到新数组中
    while(i < m && j < n) {
        if(nums1[i] < nums2[j]) {
            num[k++] = nums1[i++];
        } else {
            num[k++] = nums2[j++];
        }
    }
    //如果离开上述while后,那么还会存在其中某个数组并未完全填充的情况,需得充分考虑
    while(i < m) {
        num[k++] = nums1[i++];
    }
    while(j < n) {
        num[k++] = nums2[j++];
    }
    //直接利用了sort来进行排序
    //排序性能受到数据量的影响
    Arrays.sort(num);
    //根据长度的奇偶来返回数据,注意返回double类型
    if(num.length % 2 != 0) {
        return num[num.length / 2];
    } else {
        return (num[num.length / 2] + num[num.length / 2 - 1]) / 2.0;
    } 
}

2.lc05

题目

思路

        利用到动态规划,需要从中心往两边发散的思想,同时要记得先初始化dp数组

解答

public String longestPalindrome(String s) {
    int len = s.length();
    //dp[i][j] 表示以i开始,j结束的子字符串是否是回文子串
    boolean[][] dp = new boolean[len][len];
    if(len <= 1) return s;
    //初始化dp,所有长度为1的字符串都是回文子串
    for(int i = 0 ; i < len ; i++) {
        dp[i][i] = true;
    }
    //不断更新的最左边以及最长回文子串的长度
    int begin = 0;
    int maxlen = 1;
    char[] arr = s.toCharArray();
    //枚举从2到len
    for(int i = 2 ; i <= len ; i++) {
        // 子串的最左边
        for(int j = 0 ; j < len ; j++) {
            //子串的右边
            int k = i + j - 1;
            if(k >= len) {
                break;
            }
            //如果不等, 那么不符合回文子串的定义,直接false
            if(arr[j] != arr[k]) {
                dp[j][k] = false;
            } else {
                //如果等,需要判断一下,两头的相等,就要看往里缩一位是否为true,如果为true,那么加上两头的才是回文串
                if( k - j < 3) {
                    dp[j][k] = true;
                } else {
                    dp[j][k] = dp[j + 1][k - 1];
                }
            }
            //如果以j开头k结尾的子串是true,代表是回文子串,如果大于此时最长长度,则更新结果
            if(dp[j][k] && k - j + 1 > maxlen) {
                begin = j;
                maxlen = k - j + 1;
            }
        }
    }
    //用String的方法来返回最长回文子串
    return s.substring(begin , begin + maxlen);

3.lc06

题目

思路

        本题解答非常巧妙,由于看到到达最上和最下两行的时候,需要调换方向,所以只需要使用到一个标记位,当遇到两头的时候,将该标记位置为相反数即可。

解答

public String convert(String s, int numRows) {
    if(numRows < 2) return s;
    //用List将每一行的字符串存起来
    //为了便于存储,使用StringBuilder结构
    List<StringBuilder> rows = new ArrayList<>();
    for(int i = 0 ; i < numRows ; i++) {
        rows.add(new StringBuilder());
    }
    //i用来标记当前是第几行
    int i = 0;
    //flag标志位用来换方向
    int flag = 1;
    for(char c : s.toCharArray()) {
        rows.get(i).append(c);
        i += flag;
        //当遇到第0行或者最后一行,就需要换方向 flag置为相反数即可
        if(i == 0 || i == numRows - 1) {
            flag = -flag;
        }
    }
    StringBuilder res = new StringBuilder();
    //遍历所有的StringBuilder,将每个String存到res中
    for(StringBuilder sb : rows) {
        res.append(sb);
    }
    //由于返回的是String,需要调用toString(),将StringBuilder转回String
    return res.toString();

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

准入职的java螺丝钉一枚

你的鼓励是我继续不断创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值