int MaxWindowTotal(int[] values, int windowSize)

原题:

MaxWindowTotal will take an array of integers and a windowSize, and return the maximum total of any consecutive sequence of integers of length windowSize.
For example, given (array =  [5, 12, 25, 7, 9], windowSize = 3), the method will return 44 (the sum of 12, 25, and 7 is the greatest total of any 3 consecutive integers in the array).
Implement MaxWindowTotal

5, 12, 25, 7, 9

5, 12, 25 = 42
12, 25, 7 = 44
25, 7, 9 = 41
*/



思路分析:
1 本题需要注意consecutive (连续),不是返回N个元素就可以,必须连续;
2 定义sum时,要以Int32.MinValue为准; 不能初始化为0,否则无法处理负数输入;
3 先用暴力算法,再用动态规划算法; 即存储每次的结果,然后公式: int sum = resultArr[i] - values[i] + values[i + windowSize  ];

解决方案1,暴力算法

 static void Main(string[] args)
        {
            int[] arr = new int[] { 5, 12, 25, 7, 9 };
            int windowSize = 3;
            int sum = MaxWindowTotal(arr, windowSize);
            Console.WriteLine(sum);
            Console.ReadKey();

        }

        static int MaxWindowTotal(int[] values, int windowSize)
        {
            //boundary condition
            if (windowSize > values.Length)
                throw new Exception("windowSize is bigger than value'sLength");

            int max = Int32.MinValue;//此处如果是负数的话;
            for (int i = 0; i <= values.Length - windowSize; i++)
            {
                int sum = GetSum(values, i, i + windowSize);
                if (sum > max)
                    max = sum;
            }
            return max;

        }

        static int GetSum(int[] values, int startIndex, int endIndex)
        {
            int result = 0;
            for (int i = startIndex; i < endIndex; i++)
            {
                result += values[i];
            }
            return result;
        }



动态规划解决方案,即每次计算完和都存下来,防止下次重复计算求和过程;

static int MaxWindowTotal(int[] values, int windowSize)
        {
            if (windowSize > values.Length)
                throw new Exception("windowSize is bigger than value's Length");
            int max = Int32.MinValue;
            int[] resultArr = new int[values.Length - windowSize + 1];
            resultArr[0] = GetSum(values, 0, 0 + windowSize);
            if (resultArr[0] > max)
                max = resultArr[0];
            for (int i = 0; i < values.Length - windowSize; i++)
            {
                int sum = resultArr[i] - values[i] + values[i + windowSize  ];
                resultArr[i+1] = sum;
                if (sum > max)
                    max = sum;
            }
            return max;
        }
        static int GetSum(int[] values, int startIndex, int endIndex)
        {
            int result = 0;
            for (int i = startIndex; i < endIndex; i++)
            {
                result += values[i];
            }
            return result;
        }





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值