dp练习题:
做出来了,但是执行很慢。。。。
/**
* 输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
* 输出:6
* 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
*
*/
@Test
public void test() {
int[] nums = new int[]{-2,1,-3,4,-1,2,1,-5,4};
int s = maxSubArray(nums);
System.out.println(s);
}
public int maxSubArray(int[] nums) {
if (nums == null || nums.length < 1) {
return 0;
}
// 1。确定状态dp表示i位置的最大的和
// 2。确定递推公式,那么dp[i]的最大的和为dp[i-1]+nums[i] 和 nums[i]的较大者
int[] dp = new int[nums.length];
dp[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
// int tmp = dp[i - 1] + nums[i];
dp[i] = (dp[i - 1] + nums[i]) > nums[i] ? dp[i - 1] + nums[i] : nums[i];
}
Arrays.sort(dp);
// System.out.println(Arrays.toString(dp));
return dp[dp.length - 1];
}
V2版本,击败95%,主要是去掉了最后的排序
@Test
public void test() {
int[] nums = new int[]{-2,1,-3,4,-1,2,1,-5,4};
int s = maxSubArray(nums);
System.out.println(s);
}
public int maxSubArray(int[] nums) {
if (nums == null || nums.length < 1) {
return 0;
}
// 1。确定状态dp表示i位置的最大的和
// 2。确定递推公式,那么dp[i]的最大的和为dp[i-1]+nums[i] 和 nums[i]的较大者
int[] dp = new int[nums.length];
dp[0] = nums[0];
int max = dp[0];
for (int i = 1; i < nums.length; i++) {
// 如果dp[i]=nums[i]时,那么连续子数组开始从i这里从新计算
dp[i] = (dp[i - 1] + nums[i]) > nums[i] ? dp[i - 1] + nums[i] : nums[i];
max = Math.max(max, dp[i]);
}
return max;
}