假設你是一位很棒的家長,想要給你的孩子們一些小餅乾。可是,每一個孩子最多隻能給一塊餅乾。對每一個孩子 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
循環,不用迭代計算,優化了過程。