給定 n 個(gè)整數(shù),找出平均數(shù)最大且長(zhǎng)度為 k 的連續(xù)子數(shù)組,并輸出該最大平均數(shù)。
例如:
輸入:[1,12,-5,-6,50,3], k = 4
輸出:12.75
解釋?zhuān)鹤畲笃骄鶖?shù) (12-5-6+50)/4 = 51/4 = 12.75
解題思路:
雙指針
典型的滑動(dòng)窗口, 雙指針問(wèn)題
設(shè)置初始結(jié)束指針, 不斷平移查找最大即可

exp1

exp2

exp3
未翻譯版
func findMaxAverage(_ nums: [Int], _ k: Int) -> Double {
var start = 0, end = k - 1, result = 0, last = 0
for i in 0..<k {
result += nums[i]
last = result
}
while end < nums.count - 1 {
start += 1
end += 1
last = last - nums[start-1] + nums[end]
result = max(result, last)
}
return Double(result)/Double(k);
}
翻譯版
func findMaxAverage(_ nums: [Int], _ k: Int) -> Double {
// 設(shè)置初始,結(jié)束指針(數(shù)組下標(biāo)), 返回值等
var start = 0, end = k - 1, result = 0, last = 0
// 得到初始的最大值
for i in 0..<k {
result += nums[i]
// last用來(lái)存每次新的k元素之和, 初始設(shè)為0 ~ k-1, 元素相加之和
last = result
}
// 循環(huán), 結(jié)束指針為 nums.count - 1 就結(jié)束循環(huán)
while end < nums.count - 1 {
// 開(kāi)始, 結(jié)束指針往后移一位, 也可理解成滑動(dòng)了一下窗口
start += 1
end += 1
// last用來(lái)存每次新的k元素之和
last = last - nums[start-1] + nums[end]
// result取最大值
result = max(result, last)
}
// 返回結(jié)果, /k 的操作放在最后處理就行, 結(jié)果不變
return Double(result)/Double(k);
}
題目來(lái)源:力扣(LeetCode) 感謝力扣爸爸 :)
IOS 算法合集地址