zoukankan      html  css  js  c++  java
  • [Algorithm] Maximum Contiguous Subarray algorithm implementation using TypeScript / JavaScript

    Naive solution for this problem would be caluclate all the possible combinations:

    const numbers = [1, -3, 2 - 5, 7, 6, -1, -4, 11, -23];
    
    // O(n^3)
    const findMaxSubAry = numbers => {
      let answer = Number.MIN_VALUE;
      /**
       * Calculate all the possible values and pick the max one
       * All possible values should be
       * length = 1, 2, ,3 ... n
       *  Pick differnet start point
       */
    
      // For different lenght
      for (let l = 0; l < numbers.length; l++) {
        // O(n)
        // For different start
        for (let s = 0; s < l; s++) {
          // O(n)
          if (s + l >= numbers.length) {
            break;
          }
          let sum = 0;
          for (let i = s; i < s + l; i++) {
            // O(n)
            sum += numbers[i];
          }
    
          answer = Math.max(answer, sum);
        }
      }
    
      return answer;
    };
    
    console.log(findMaxSubAry(numbers));  // 19

    The maximum subarray problem is one of the nicest examples of dynamic programming application.

    In this lesson we cover an example of how this problem might be presented and what your chain of thought should be to tackle this problem efficiently.

     /**
      * Maximum Contiguous subarray algorithm
      * 
      * Max(i) = Max(i-1) + v(i)
      * Max(i-1) < 0 ? v(i) : Max(i-1)
      * 
      * Combining
    ---------
    maxInc(i) = maxInc(i - 1) > 0 ? maxInc(i - 1) + val(i) : val(i)
    max(i) = maxInc(i) > max(i - 1) ? maxInc(i) : max(i - 1)
      */
    function maxSumSubArray(arr) {
      /**
       *   inx  | val   |  max_inc    | max 
       *          0       0            0
       *    0     -2      0            0
       *    1     -3      0            0
       *    2     4       4            4     ---> start = 2
       *    3     -1      3            4
       *    4     -2      1            4
       *    5     1       2            4
       *    6     5       7            7     ---> end  = 6
       *    7     -3      4            7             
       */
    
      let val = 0, max_inc = 0, max = 0, start = 0, end = 0;
    
      for (let i = 1; i < arr.length; i++) {
        val = arr[i];
        max_inc = Math.max(max_inc + val, val);
        max = Math.max(max, max_inc);
    
        if (val === max_inc) {
          start = i;
        }
    
        if (max === max_inc) {
          end = i;
        }
      }
    
      if (end === 0) {
        end = start;
      }
      console.log(start, end);
      return arr.slice(start, end + 1);
    }
    
    console.log(maxSumSubArray([-2, -3, 4, -1, -2, 1, 5, -3])); //[4, -1, -2, 1, 5]
    console.log(maxSumSubArray([-2,-3,-4,-1,-2])); // [-2]
  • 相关阅读:
    【ci框架】PHP常见面试题汇总。。。
    fieldset的collapse和expand事件
    CI 学习
    Ext JS 4预览:重构和规范渲染过程()
    LAMP环境搭建过程
    Extjs中FieldSet的收缩和展开实例
    EXTJS组件化(三)----组件之间的暧昧关系
    EXTJS组件化(四)---减少你的代码
    EXTJS组件化(二)----简易的私有和公有
    EXTJS组件化(一)----建立你的思想
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10227039.html
Copyright © 2011-2022 走看看