我在Java中有以下Kadane算法的实现。它基本上是找到连续子阵列的最大总和。
String[] numbers = string.split(",");
int max_so_far = 0;
int max_ending_here = 0;
for (int i = 0; i < numbers.length-1;i++){
max_ending_here = max_ending_here + Integer.parseInt(numbers[i]);
if (max_ending_here < 0)
max_ending_here = 0;
if (max_so_far < max_ending_here)
max_so_far = max_ending_here;
}
System.out.println(max_so_far);
但是,如果数组中存在负数和正数的组合,则不起作用,例如:
2,3,-2,-1,10
哪个应该返回12作为最大值。截至目前,它返回5
答案 0 :(得分:12)
你的算法实现看起来没问题,但你的循环条件i < numbers.length-1
没有:它只停止数组末尾的1个。 i < numbers.length
应该这样做: - )
答案 1 :(得分:4)
这对我有用:
String string = "2,3,-2,-1,10";
String[] numbers = string.split(",");
int max_so_far = 0;
int max_ending_here = 0;
for (String num : numbers) {
int x = Integer.parseInt(num);
max_ending_here = Math.max(0, max_ending_here + x);
max_so_far = Math.max(max_so_far, max_ending_here);
}
System.out.println(max_so_far);
答案 2 :(得分:2)
关于MichałŠrajer的上述答案:
第7行:max_ending_here = Math.max(0,max_ending_here + x);
应该是:
max_ending_here = Math.max(x,max_ending_here + x);
...根据定义的Kadane算法here
答案 3 :(得分:0)
太晚了,但如果有人将来需要它。
public static void kadaneAlgo(int[][] array)
for(int i = 1; i < array.length; i++){
int max_value_index_i = numberOrSum(array[i], past);
if(max_value_index_i > sum){
sum = max_value_index_i;
}
past = max_value_index_i;
}
System.out.println("Max sum from a contiguous sub array is : " + sum);
}
public static int numberOrSum(int number, int past){
return Math.max(number, number+past);
}