求数组中和最大的子数组与始末下标
2011-12-13 08:19
211 查看
................
................
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace MaxSUM { class Program { static void Main(string[] args) { //初始化目标数组 int[] myArray = new int[] { 13, -41, 42, 26, -33, 59, 97, -90, -23, 84 }; myArray = new int[] { 1, 2, 3, -4, 5 }; //myArray = new int[] { 1, 2, 3, -4, -5 }; //myArray = new int[] { 1, 2, 3, -4, -5, 6, 7 }; //myArray = new int[] { 1, 2, 3, -4, -5, -6, 7 }; GetMaxSum(myArray, myArray.Length); } /// <summary> /// 获取连续子数组的最大和 /// </summary> /// <param name="array">目标数组</param> /// <param name="length">数组的长度</param> private static void GetMaxSum(int[] array, int length) { int sum = 0; //记录当前连续子数组的最大和 int temp = 0; //记录当前数组连续几个元素的和(当其值小于0时,重新对其赋值;【即:抛弃前面的所有元素】) int startIndex = 0; //记录子数组(和最大)的起始位置 int endIndex = 0; //记录子数组(和最大)的终止位置 int newStartIndex = 0; //记录子数组(和最大)的新的起始位置 for (int i = 0; i < length; i++) //遍历整个目标数组 { if (temp < 0) //如果temp < 0;则要对temp重新赋值 { temp = array[i]; //对temp重新赋值 newStartIndex = i; //暂时记录子数组(和最大)的新的起始位置(要看后续的sum 和 temp是否发生交换) } else { temp += array[i]; //如果temp >= 0;则要继续将此时的数组元素(array[i])加入到temp中 } if (sum < temp) //如果此时 sum < temp;则表示此时的子数组和大于之前的子数组和 { sum = temp; //将大的子数组和temp赋值给sum startIndex = newStartIndex; //子数组(和最大)的新的起始位置起作用了 endIndex = i; //子数组(和最大)的终止位置(只要发生交换就说明endIndex发生变化) } } //显示最终的结果(从数组的第N个元素到M个元素之和最大) DisplayResult(array, sum, startIndex, endIndex); } /// <summary> /// 显示最终的结果 /// </summary> /// <param name="array">目标数组</param> /// <param name="maxSum">最大子数组之和</param> /// <param name="startIndex">最大子数组的起始位置(按数组下标从0开始计数)</param> /// <param name="endIndex">最大子数组的终止位置(按数组下标从0开始计数)</param> private static void DisplayResult(int[] array, int maxSum, int startIndex, int endIndex) { Console.WriteLine("The original array is: "); for (int i = 0; i < array.Length; i++) { Console.Write(array[i] + " "); } string expression = string.Empty; for (int i = startIndex; i <= endIndex; i++) { if (array[i] < 0) { expression += string.Format("({0})", array[i].ToString()) + " + "; } else { expression += array[i].ToString() + " + "; } } Console.WriteLine("\n"); Console.WriteLine("The final Result is : SUM({0},{1}) = {2} = {3}", startIndex, endIndex, expression.TrimEnd(new char[] { ' ', '+' }), maxSum); } } }
................
相关文章推荐
- 求数组中和最大的子数组与始末下标
- 实验6-1 输入n个整数,将它们存入数组a中。输出最大值和它所对应的下标
- 一个整形数组中有正数也有负数,数组中连续一个或多个组成子数组,每个子数组都有一个和,求所有子数组中和的最大值
- js实现求连续子数组的最大和并输出下标
- 算法跨语言/*从一维数组100个数据中选出最大10个数的下标及最小6个数的下标*/
- 求整数数组中和最大的子数组
- PHP获取数组最大值下标的方法
- 在一个有8个整数(18,25,7,36,13,2,89,63)的数组中找出其中最大的数及其下标。
- 面试题,求一个整数数组中和最大的连续子数组,例如:[1, 2, -4, 4, 10, -3, 4, -5, 1]的最大连续子数组是[4, 10, -3, 4](需写明思路,并编程实现)
- 一个整形数组中有正数也有负数, 数组中连续一个或多个组成子数组,每个子数组都有一个和, 求所有子数组中和的最大值
- 输入n个整数,将它们存入数组a中。输出最大值和它所对应的下标
- 实验 6 数组1、输入n个整数,将它们存入数组a中。输出最大值和它所对应的下标。
- 求数组中和最大的子数组(数组中和最大的子串)
- 实验9 指针1 1、程序填空:下列程序在数组中同时查找最大元素和最小元素的下标,分别存放在 main()函数的max 和 min 变量中。要求:根据运行结果分析程序和填空,并注释说明填充依据。
- 求整数数组中和最大的子数组的3种方法
- 编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)
- 求数组中和最大的子数组(数组中和最大的子串)
- 【C++程序设计】补6.1 输出数组最大值及其下标
- 输入n个整数,将它们存入数组a中。输出最大值和它所对应的下标。
- 数组的子数组之和的最大值和下标的开始与结束