算法-贪心算法思想

贪心算法

是什么

  1. 期盼通过每个阶段的局部最优选择,从而达到全局的最优
  2. 结果并不一定是最优

leetcode

455

思路

  1. 对饼干数组和胃口数组升序排序
  2. 遍历饼干数组,找到能满足第一个孩子的饼干
  3. 然后继续遍历饼干数组,找到满足第二,三...孩子的饼干

代码

// g:孩子
// s:饼干
var findContentChildren = function(g, s) {
  var funcSort = function(a,b){
    return a-b
  }
  g.sort(funcSort)
  s.sort(funcSort)
  let i =0; //代表第1个孩子
  s.forEach(n => {
    if(n >= g[i]){ 代表第i个孩子
      i++
    }
  })
  return i;
};

复杂度分析

  1. 时间复杂度:O(mlogm + nlogn)O(mlogm+nlogn),其中 mm 和 nn 分别是数组 gg 和 ss 的长度。对两个数组排序的时间复杂度是 O(mlogm + nlogn)O(mlogm+nlogn),遍历数组的时间复杂度是 O(m+n)O(m+n),因此总时间复杂度是 O(mlogm + nlogn)O(mlogm+nlogn)。
  2. 空间复杂度:O(log m + log n)O(logm+logn),其中 mm 和 nn 分别是数组 gg 和 ss 的长度。空间复杂度主要是排序的额外空间开销。

122

思路

  1. 新建一个变量,用来统计总利润
  2. 遍历价格数组,如果当前价格比昨天高,就在昨天买,今天卖,否则就不交易
  3. 遍历结束后,返回所有利润之和

代码

var maxProfit = function(prices) {
  let priceO = 0;
  for(let i =1;i prices[i-1]){
      priceO += prices[i]-prices[i-1]
    }
  }
  return priceO
};

例子 [1,2,3,4,5],数组的长度 n=5,由于对所有的i < n1≤ia[i-1],因此答案为
(2-1)+(3-2)+(4-3)+(5-4) = (5-1)

但是实际的交易过程并不是进行 4 次买入和 4 次卖出,而是在第 1 天买入,第 5 天卖出

复杂度分析

  • 时间复杂度:O(n),其中 n 为数组的长度。我们只需要遍历一次数组即可。
  • 空间复杂度:O(1)。只需要常数空间存放若干变量。

你可能感兴趣的:(算法)