LeeCode - 分發餅乾

LeeCode - 分發餅乾

題目:

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

注意:數組

你能夠假設胃口值爲正。 一個小朋友最多隻能擁有一塊餅乾。測試

示例 1:優化

輸入: [1,2,3], [1,1]ui

輸出: 1spa

解釋: 你有三個孩子和兩塊小餅乾,3個孩子的胃口值分別是:1,2,3。 雖然你有兩塊小餅乾,因爲他們的尺寸都是1,你只能讓胃口值是1的孩子知足。 因此你應該輸出1code

分析:

個人想法很憨厚,先將兩個數組排序,若是 s[0] < g[0],說明該值不能知足最低胃口的小孩,此時將s[0]從數組中刪掉,將修改後的數組從新賦值迭代。若是s[0] >= g[0],則計數器自增,同時將匹配完成的值從各自的數組刪除,將修改後的數組從新賦值迭代。排序

sr[sr.length] < gr[0] || sr.length == 0 || gr.length == 0時,中止並返回計數器。內存

答案:

const sortArray = function (arr) { // 數組排序方法
  for (let i = 0; i < arr.length; i++) {
    for (let j = i + 1; j < arr.length; j ++) {
      if (arr[i] > arr[j]) {
        arr[i] = arr.splice(j, 1, arr[i])[0]
      }
    }
 }
 return arr
}

const findContentChildren = function(g, s, index) {
  let gr = sortArray(g) // 排序一下
  let sr = sortArray(s) 
  let x = index
  if (sr[sr.length] < gr[0] || sr.length == 0 || gr.length == 0) {
    console.log(x)
    return x
  }
  if (sr[0] < gr[0]) {
    sr.shift()
  } else {
    gr.shift()
    sr.shift()
    x ++
  }
  findContentChildren(gr, sr, x)
}
findContentChildren([3, 2, 1, 3, 6, 5], [2, 1, 4, 6, 1, 9], 0)
複製代碼

結果:提交失敗io

由於 leecode 測試用的參數中沒有計數器。。因此提交失敗了,可是通過我的測試,這個方法能返回正確的值。

優化解法

貪心算法

貪心算法的基本思路是從問題的某一個初始解出發一步一步地進行,根據某個優化測度,每一步都要確保能得到局部最優解。每一步只考慮一個數據,他的選取應該知足局部優化的條件。若下一個數據和部分最優解連在一塊兒再也不是可行解時,就不把該數據添加到部分解中,直到把全部數據枚舉完,或者不能再添加算法中止

對於這個題目,個人理解就是,用最低的餅乾值儘可能去知足最大的胃口值,因此得先對數組進行排序。

var findContentChildren = function(g, s) {
 let index = 0
  g.sort((a, b) => a - b)
  s.sort((a, b) => a - b)
  let length = g.length
  for (let i = 0; i < length; i++) {
      if (g.length > 0 && s.length > 0) {
          if (s[0] >= g[0]) {
              g.splice(0, 1)
              index += 1
          }
          s.splice(0, 1)
      } else {
          break
      }
  }
  return index
};
複製代碼

結果:提交成功

耗時:160ms

內存:39.2MB

首先數組的排序使用了array.sort()方法,比個人簡單不少。而後該答案使用了for循環,不用迭代計算,優化了過程。

相關文章
相關標籤/搜索