精华帖 (1) :: 良好帖 (0) :: 新手帖 (2) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2012-05-03
最后修改:2012-05-03
LZ,是不是又要交作业了,没地方草呢
http://www.iteye.com/topic/1035598 |
|
返回顶楼 | |
发表时间:2012-05-03
{8,12}
要的是这个么? |
|
返回顶楼 | |
发表时间:2012-05-03
cttnbcj 写道 LZ,是不是又要交作业了,没地方草呢
http://www.iteye.com/topic/1035598 交个p作业啊 ,哥去面试被 问到了。所以拿回来跟大家分享下而已。 |
|
返回顶楼 | |
发表时间:2012-05-03
public static void main(String[] args) { int[] array = {1, 2, 3, -2, 4, 8, -1, 5, -2, 12, 9, -5, 6, 11}; // int[] array = {-11, -1, -3, -4, -8, -11, -5, -2, -12, -9, -5, -6, -11}; // int[] array = {0, 0, 0}; // int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int max = 0; int temp = 0; int indexStart = 0; int indexEnd = array.length - 1; int count = 0; boolean allNegative = true; int maxNegativeNum = Integer.MIN_VALUE; for (int i = 0; i < array.length; i++) { if (array[i] >= 0) { allNegative = false; temp += array[i]; count++; } if (array[i] < 0) { if (temp > max) { max = temp; indexStart = i - count; indexEnd = i - 1; } if (array[i] > maxNegativeNum) { maxNegativeNum = array[i]; } temp = 0; count = 0; } } if (temp > max) { max = temp; indexStart = array.length - count; indexEnd = array.length - 1; } if (allNegative) { System.out.printf("Max value and sublist are same value: %d%n", maxNegativeNum); return; } System.out.printf("Max value: %d%nSublist:", max); for (int i = indexStart; i <= indexEnd; i++) { System.out.printf(" %d", array[i]); } } } |
|
返回顶楼 | |
发表时间:2012-05-03
考算法....动态规划...
|
|
返回顶楼 | |
发表时间:2012-05-03
我没看明白。。。
|
|
返回顶楼 | |
发表时间:2012-05-03
jarorwar 写道 ls2005nba 写道 ....我看了题目两遍还是不明白什么意思
去 arr[] 中的元素 组成一个新的数组 。。。 找和最大 。。。。。。 做个循环 把 大于零的加一起 不就好了 当然不是你想的这个样子 可能是我描述的有问题 举个例子,例如数组int a={10,-90,200} 那么它的子数组可以是 {10} {10,-90} {10,-90,200} {-90} {-90,200} {200} 当然 最大的子数组之和就是200了 我晕,难道这个子数组里不应该包含{10,200}吗?那么最大的子数组之各应该是210才对啊 |
|
返回顶楼 | |
发表时间:2012-05-04
最后修改:2012-05-04
题目说得不清。连帖子标题都不通顺。
应该是求一个数字组成的系列中“和最大的连续子系列”吧。 可以做以下几点处理: 1 结果的首尾一定是正数。所以可以从两端开始去掉负数和0。比如[-1,-2,0,3,4,-3,7,9,-3,-5,0]的最好结果一定在[3,4,-3,7,9]中出现。 2 连续的正数(包含0)一定可以合并。最佳结果中不可能只包含一个连续正数系列的一部分。 3 连续的负数(包含0)也可以合并。因为根据1可知连续的负数一定出现在子系列的中间位置。 4 最终的结果中两端的0可以去掉(也可以不去掉)。 2,3的意思是说如果遇到连续的非正数或非负数,可以直接全部加入(而不需要尝试加入,再求和,再与当前最佳max进行比较)。如 |
|
返回顶楼 | |
发表时间:2012-05-04
这个数组本身最大
|
|
返回顶楼 | |
发表时间:2012-05-04
最后修改:2012-05-04
whb1984 写道 public static void main(String[] args) { int[] array = {1, 2, 3, -2, 4, 8, -1, 5, -2, 12, 9, -5, 6, 11}; // int[] array = {-11, -1, -3, -4, -8, -11, -5, -2, -12, -9, -5, -6, -11}; // int[] array = {0, 0, 0}; // int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int max = 0; int temp = 0; int indexStart = 0; int indexEnd = array.length - 1; int count = 0; boolean allNegative = true; int maxNegativeNum = Integer.MIN_VALUE; for (int i = 0; i < array.length; i++) { if (array[i] >= 0) { allNegative = false; temp += array[i]; count++; } if (array[i] < 0) { if (temp > max) { max = temp; indexStart = i - count; indexEnd = i - 1; } if (array[i] > maxNegativeNum) { maxNegativeNum = array[i]; } temp = 0; count = 0; } } if (temp > max) { max = temp; indexStart = array.length - count; indexEnd = array.length - 1; } if (allNegative) { System.out.printf("Max value and sublist are same value: %d%n", maxNegativeNum); return; } System.out.printf("Max value: %d%nSublist:", max); for (int i = indexStart; i <= indexEnd; i++) { System.out.printf(" %d", array[i]); } } } 算法不对,你用 {-1,-2,-3,0,0,1, 1,1,-5,1,1,1,1,1,-2,-1,0,4,-3,0,-1} 测试一下,运行结果是 Max value: 5 Sublist: 1 1 1 1 1 正确答案应该是: Max value: 6 Sublist: 1,1,1,1,1,-2,-1,0,4 如果用 {-1,-2,-3,-4}测试结果也会错误,因为你假设初始最佳max=0,这个假设显示不对。 |
|
返回顶楼 | |