1、Maximum Subarray
1)方法一
class Solution {
public int maxSubArray(int[] nums) {
int result=nums[0];
for(int i=0;i<nums.length;i++){
int sum=nums[i];
if(sum>result){
result=sum;
}
for(int j=i+1;j<nums.length;j++){
sum=sum+nums[j];
if(sum>result){
result=sum;
}
}
if(sum>result)
result=sum;
}
return result;
}
}
2)方法二
class Solution {
public int maxSubArray(int[] nums) {
int sum=0;
int max=Integer.MIN_VALUE;
for(int i=0;i<nums.length;i++)
{
sum=sum+nums[i];
if(sum>max)
max=sum;
if(sum<0)
sum=0;
}return max;
}
}
3)方法三
class Solution {
public int maxSubArray(int[] nums) {
if (nums.length == 1) return nums[0];
int max = nums[0];
for (int i = 1; i < nums.length; i++) {
nums[i] = Math.max(nums[i - 1] + nums[i], nums[i]);
if (nums[i] > max) max = nums[i];
}
return max;
}
}
感悟
1:最笨的方法(逻辑一):求出所有的子集计算和取最大(最简单的逻辑,却有语言不同组织的代码量——逻辑一定要清晰!!!!——两次循环时间复杂度较大)
逻辑二:出现和为负值的情况重开一个子集——相邻子集的最大和——一次循环——max:记录目前最大的子集和 若出现负值开启另一个子集。(没有破坏数组原有的结构)
逻辑三:利用数组,在数组本身上进行操作。nums[i-1]存储当前数组在“当前处理子集”的最大值,其正负决定了是否重开一个处理子集还是在原来子集的基础上再增加新的元素
2: 可以直接调用Integer.MIN_VALUE;
3:数组:1)注意溢出和边界
2)one by one
3)可one by one 动态分治操作