1. Question: Given a intarray, please find the sub array which has maximum sum of these elements,return the index, length and sum
2. Solution: Let's define(sum1, index1, length1) and (sum2, index2, length2) to identify the previous Maximussum(sum2) and current Maximus sum(sum1), if the sum1 is greater or equal sum2,make the (sum2=sum1, index2=index2, length2=length1), then try to find the lagersum1 until every elements are iterated. Before iterate the last element, the sum2is always greater or equal to sum1;
Defect: Thissolution can’t cover that case there are 2 more than 2 sub array has the Maximussum.
· initialization:
int sum1;
int index1=0;
int length1=1;
int sum2;
int index2=0;
int length2=1;
sum1=array [0];
sum2=array[0];
· Determine if we should add array[i]into Sum1
| Sum1 | Array[i] | Determination logic | Test scenario |
0 | >= | >= | Add array[i] to Sum1, then (sum2, index2, length2) =(sum1, index1, length1) | Case: Sum1=10; Array[i]=2;
New sum1=12; Compare Sum2 and Sum1: Sum2= Sum2<=Sum1?Sum1:Sum2 |
0 | >= | < | If sum1+array[i]>=0, add array[i] to sum1, but don’t do (sum2, index2, length2) =(sum1, index1, length1)
If sum1+array[i]<0, we can say the array[i] is Negative equity, after add it, the sum1 even become negative
Since the sum2 keep the Maximus also, initial the sum1 again to try to find larger sum greater than sum2 | Case: Sum1=10; Array[i]=-8;
New sum1=2; Sum2(not change) Case: Sum1=10; Array[i]=-12;
New sum1=-12; Sum2(not change) |
0 | < | >= | Set sum1=array[i]; | Case Sum1=-10; Array[i]=2;
New sum1=2, Sum2= Sum2<=Sum1?Sum1:Sum2 |
0 | < | < | If array[i]>sum1, Then sum1=array[i]; | Case: Sum1=-10 Array[i]=-8;
Sum1=-8; Sum2=Sum2<=Sum1?Sum1:Sum2 |
3. Implement by C#
4. public class GetMaxSum 5. { 6. private int index; 7. private int length; 8. private int sum; 9. 10. public int Index 11. { 12. get 13. { 14. return index; 15. } 16. set 17. { 18. index = value; 19. } 20. } 21. public int Length 22. { 23. get 24. { 25. return length; 26. } 27. set 28. { 29. length = value; 30. } 31. } 32. public int Sum 33. { 34. get 35. { 36. return sum; 37. } 38. set 39. { 40. sum = value; 41. } 42. } 43. 44. public GetMaxSum() 45. { 46. index = default(int); 47. length = default(int); 48. sum = default(int); 49. } 50. 51. public void MaxSumOfSub(int[] array) 52. { 53. if (array.Length == 0) 54. { 55. return; 56. } 57. 58. int sum1; 59. int index1 = 0; 60. int length1 = 1; 61. int sum2; 62. int index2 = 0; 63. int length2 = 1; 64. 65. sum1 = array[0]; 66. sum2 = array[0]; 67. 68. for (int i = 1; i <= array.Length - 1; i++) 69. { 70. if (sum1 >= sum2) 71. { 72. sum2 = sum1; 73. length2 = length1; 74. index2 = index1; 75. } 76. 77. if (sum1 >= 0 && array[i] >= 0) 78. { 79. sum1 += array[i]; 80. length1++; 81. } 82. if (sum1 >= 0 && array[i] < 0) 83. { 84. if (sum1 + array[i] >= 0) 85. { 86. sum1 += array[i]; 87. length1++; 88. } 89. else 90. { 91. sum1 = array[i]; 92. index1 = i; 93. length1 = 1; 94. } 95. } 96. if (sum1 < 0 && array[i] >= 0) 97. { 98. sum1 = array[i]; 99. index1 = i; 100. length1 = 1; 101. } 102. if (sum1 < 0 && array[i] < 0) 103. { 104. if (sum1 <= array[i]) 105. { 106. sum1 = array[i]; 107. index1 = i; 108. length1 = 1; 109. } 110. } 111. } 112. 113. if (sum1 >= sum2) 114. { 115. sum = sum1; 116. index = index1; 117. Length = length1; 118. } 119. else 120. { 121. sum = sum2; 122. index = index2; 123. length = length2; 124. } 125. 126. } 127. 128. 129. } 130. |
4. Test case:
input {1,2,3,4,5}:
input {1,2,3,4,5,-1,1,2}
input {1,2,3,4,5,-1,-2,-3,-4,-5,1}
input {1,2,3,4,5,,-1,-2,-3,-4,-5,2,100}
input {-5,-4,-3,-2,-1}
input{-5,0}
input{-5,5,0}
......