[基礎算法系列] —— 貪心算法之力扣熱度TOP5貪心策略記錄

TOP1 跳躍遊戲

給定一個非負整數數組,你最初位於數組的第一個位置。數組中的每一個元素表明你在該位置能夠跳躍的最大長度。判斷你是否可以到達最後一個位置。

例如對於[2,3,1,1,4]返回真,對於[3,2,1,0,4]返回假。python

貪心策略1:若是位置i能夠到達,那麼i以前的全部位置必定能夠到達。算法

def solution(nums):
  reach = 0
  for i in range(len(nums)):
    if i > reach:
      return False
    reach = max(reach, i + nums[i])
  return True

貪心策略2:向前遍歷記錄能夠到達終點的最前的位置。數組

def solution(nums):
  start = len(nums) - 1
  for i in range(len(nums)-1, -1, -1):
    if i + nums[i] >= start:
      start = i
  return 0 == start

TOP2 跳躍遊戲Ⅱ

給定一個非負整數數組,你最初位於數組的第一個位置。數組中的每一個元素表明你在該位置能夠跳躍的最大長度。你的目標是使用最少的跳躍次數到達數組的最後一個位置。假設你老是能夠到達數組的最後一個位置。

例如對於[2,3,1,1,4]返回2。cookie

貪心策略1:每一次記錄能到終點的最前的位置,並更新終點位置。設計

def solution(nums):
  aim = len(nums) - 1
  cnt = 0
  while aim:
    for i in range(len(nums)):
      if i + nums[i] >= aim:
        aim = i
        cnt += 1
        break
  return cnt

貪心策略2:記錄位置i步長範圍內哪一個位置能到達的距離最遠,此步就走哪一個位置。code

def solution(nums):
  aim, edge, ans = 0, 0, 0
  for i in range(len(nums)-1):
    aim = max(aim, i + nums[i])
    if i == edge:
      ans += 1
      edge = aim
  return ans

TOP3 買賣股票的最佳時機II

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。設計一個算法來計算你所能獲取的最大利潤。你能夠儘量地完成更多的交易(屢次買賣一支股票)。你不能同時參與多筆交易(你必須在再次購買前出售掉以前的股票)。

例如對於[7,1,5,3,6,4]返回7,對於[1,2,3,4,5]返回4。遊戲

貪心策略:只記錄上升段收益。leetcode

def solution(prices):
  profit = 0
  for i in range(1, len(prices)):
    if prices[i] > prices[i-1]:
      profit += prices[i] - prices[i-1]
  return profit

TOP4 分割平衡字符串

在一個「平衡字符串」中,'L' 和 'R' 字符的數量是相同的。給出一個平衡字符串 s,請你將它分割成儘量多的平衡字符串。返回能夠經過分割獲得的平衡字符串的最大數量。

例如對於"RLRRLLRLRL"返回4,對於"RLLLLRRRLR"返回3。字符串

貪心策略:遍歷到平衡狀態則結果加一。get

def solution(s):
  ans, balance = 0, 0
  for i in s:
    balance += 1 if i == 'L' else -1
    if not balance: ans += 1
  return ans

TOP5 分發餅乾

假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。可是,每一個孩子最多隻能給一塊餅乾。對每一個孩子 i ,都有一個胃口值 gi ,這是能讓孩子們知足胃口的餅乾的最小尺寸;而且每塊餅乾 j ,都有一個尺寸 sj 。若是 sj >= gi ,咱們能夠將這個餅乾 j 分配給孩子 i ,這個孩子會獲得知足。你的目標是儘量知足越多數量的孩子,並輸出這個最大數值。

貪心策略:優先知足胃口小的孩子。

def solution(g, s):
  g.sort()
  s.sort()
  i, j = 0, 0
  while i < len(g) and j < len(s):
    if g[i] <= s[j]: i += 1
    j += 1
  return i
相關文章
相關標籤/搜索