前言
“这是我参与8月更文挑战的第20天,活动详情查看:8月更文挑战”
1 NC19 子数组的最大累加和问题(简单)
2. NC17 最长回文子串
NC19 子数组的最大累加和问题
描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
输入:
[1, -2, 3, 5, -2, 6, -1]
返回值: 12
思路分析:
以 arr[i] 结尾的子数组的最大累加和 依赖于 以a[i-1] 结尾的子数组的最大累加和 和 arr[i]
定义 dp 数组 dp[i] 代表 以 arr[i] 结尾的最大累加和
dp[i] = Math.max(arr[i], dp[i-1] + arr[i])
因为 dp[i] 只与 dp[i-1] 相关 因此可以使用一个变量替代 dp 数组
AC 代码:
public int maxsumofSubarray(int[] arr) {
// write code here
if (arr == null || arr.length == 0) {
return 0;
}
int len = arr.length;
int ans = arr[0];
int dp = arr[0];
for (int i = 1; i < len; i++) {
dp = Math.max(arr[i], dp + arr[i]);
ans = Math.max(ans, dp);
}
return ans;
}
NC17 最长回文子串
描述
对于一个字符串,请设计一个高效算法,计算其中最长回文子串的长度。
给定字符串A以及它的长度n,请返回最长回文子串的长度。
示例1
输入:
"abc1234321ab",12
返回值:
7
思路分析: 定义 dp 数组 dp[i][j]的值代表字符串从 i位置到 j位置是否是回文
dp[i][j] 的值 取决于 chars[i] chars[j] 是否相等 & dp[i+1][j-1]的值
当 chars[i] 不等于 chars[j] 说明 i到 j 不构成回文, 相等时 dp[i][j] = j - i == 1 || dp[i + 1][j - 1]
base case 当 i==j 时 dp[i][j] = true
注意遍历的方向 dp[i][j] 的值和 她左下角的位置相关
dp[i][j] = true 更新最大回文长度
AC 代码:
import java.util.*;
public class Solution {
public int getLongestPalindrome(String A, int n) {
// write code here
boolean[][] dp = new boolean[n][n];
int maxLen = 1;
for (int i = 0; i < n; i++) dp[i][i] = true;
for (int i = n - 1; i >= 0; i--) {
for (int j = i + 1; j < n; j++) {
if (A.charAt(i) != A.charAt(j)) continue;
dp[i][j] = j - i == 1 || dp[i + 1][j - 1];
if (dp[i][j]) {
maxLen = Math.max(maxLen, j - i + 1);
}
}
}
return maxLen;
}
}