思路:今天两题都挺简单的,思路就放在一起说了,不相交的线刚刚看题目会觉得挺麻烦的,没有什么思路,但是多手写几道例题,就会发现要实现不相交的线就是要找出两个数组中可非连续的相同子数组,不相交就是要求子数组不能顺序必须保持相对一致,这样题目就转换为了昨天的那题 直接用相同的代码就可以ac
第二题子数组和,一看题意就是很明显的动态规划题,用一维dp数组解决,dp[i]表示以nums[i]结尾的最大子序列和,所以dp[i]要么从dp[i-1]+nums[i]得到,要么直接从当前开始计算即nums[i] ,所以递推公式就是两者取最大的即可
//题目1035
class Solution {
public int maxUncrossedLines(int[] nums1, int[] nums2) {
// 也就是求非连续的最长公共子序列
int[][] dp = new int[nums1.length + 1][nums2.length + 1];
for (int i = 1; i < nums1.length + 1;i++){
for (int j = 1; j < nums2.length + 1;j++){
if (nums1[i-1] == nums2[j - 1]){
dp[i][j] = dp[i-1][j-1] + 1;
}else {
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[nums1.length][nums2.length];
}
}
//题目53
class Solution {
public int maxSubArray(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
int res = dp[0];
for (int i = 1; i < nums.length ; i++) {
// dp[i]表示以nums[i]结尾的最大子序列和
dp[i] = Math.max(dp[i-1] + nums[i],nums[i]);
// 最后一位结尾不一定最大 所以用res记录
res = Math.max(res,dp[i]);
}
return res;
}
}