手写算法: 最大子数组和

53. 最大子数组和open in new window

思路

用动态规划来实现

  1. sum 记录和,result 记录最大值;

  2. 当 sum > 0 时,对结果有增益效果,可以相加;

  3. 当 sum < 0 时,说明前面的数都为负数,可以全部舍去,从当前的这个开始相加;

  4. 最后 sum 与 result 相比,谁大取谁;

/**
 * @param {number[]} nums
 * @return {number}
 */
var maxSubArray = function(nums) {
  let result = nums[0];
  let sum = 0;

  for (let i = 0; i < nums.length; i++) {
    if (sum > 0) {
      sum += nums[i];
    } else {
      sum = nums[i];
    }
    result = Math.max(sum, result);
  }
  return result;
};

手写题:实现 async helper - parallel()

实现 async helper - parallel()open in new window

解法一

/**
 * @param {AsyncFunc[]} funcs
 * @return {(callback: Callback) => void}
 */
function parallel(funcs) {
  return function(callback, data) {
    let result = [],
      isError = false;

    funcs.forEach((func, index) => {
      func((error, data) => {
        if (isError) return;
        if (error) {
          isError = true;
          callback(error, undefined);
        }
        result[index] = data;
        if (Object.keys(result).length === funcs.length) {
          callback(undefined, result);
        }
      }, data);
    });
  };
}

解法二

/**
 * @param {AsyncFunc[]} funcs
 * @return {(callback: Callback) => void}
 */
function parallel(funcs) {
  // your code here
  return (callback, data) => {
    Promise.all(funcs.map(fn => parallelify(fn, data)))
      .then(outputs => callback(undefined, outputs))
      .catch(error => callback(error, undefined));
  };
}

function parallelify(fn, input) {
  return new Promise((resolve, reject) => {
    fn((error, data) => (error ? reject(error) : resolve(data)), input);
  });
}
Last Updated:
Contributors: kk