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