代码随想录day27 || 455 分饼干,376 摆动序列,53 最大子序列和
分饼干
copy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
func findContentChildren(g []int, s []int) int {
// 第一思路,双指针暴力解法
var count int
var used2 = make([]bool, len(s))
g = quicksort(g)
s = quicksort(s)
for _, child := range g {
for idx, cookie := range s {
if !used2[idx] && cookie >= child{
used2[idx] = true
count++
break // 该child分到饼干就退出循环,让下一个child参与
}
}
}
return count
}
func quicksort(li []int) []int{
if len(li) == 0 {
return nil
}
r := rand.New(rand.NewSource(time.Now().Unix()))
povid := li[r.Intn(len(li))] // 随机值作为基准
var left, right, equal []int
for _, l := range li {
if l > povid {
right = append(right, l)
}else if l < povid {
left = append(left, l)
}else {
equal = append(equal, l)
}
}
left = quicksort(left)
right = quicksort(right)
return append(left, append(equal, right...)...)
}
// 必须要排序,不然可能出现最大的饼干分给需求最小的child,导致后面较大的需求无法满足
时间 快排nlogn * 2 + n^2 空间 n
copy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
func findContentChildren(g []int, s []int) int {
// 第一思路,另一种写法
var count int
var idxs int
g = quicksort(g)
s = quicksort(s)
for _, child := range g {
for idxs < len(s) {
if s[idxs] >= child {
count++
idxs++
break
}
idxs++
}
}
return count
}
376 摆动序列
copy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
func wiggleMaxLength(nums []int) int {
// 思路 遇到相邻元素积是0或者负数,计数加一
if len(nums) == 1 {
return 1
}
var diffpre, diff, count int
for i := 1; i < len(nums); i++ {
diff = nums[i] - nums[i - 1]
if diffpre <= 0 && diff > 0 ||
diffpre >= 0 && diff < 0 {
count++
}
if diff != 0 { // 出现单调情况再赋值,避免出现情况4也被统计
diffpre = diff
}
}
return count + 1
}
53 最大子序列和
copy
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
func maxSubArray(nums []int) int {
// 分别存储连续和以及最大和,连续和不断贪心往后累加,如果大于最大和就更新最大和
// 连续和更新逻辑,如果目前大于0,往后累加,如果小于0,舍弃,直接等于当前元素
var sum, maxsum int
maxsum = math.MinInt
for _, v := range nums {
if sum >= 0 {
sum += v
}else {
sum = v
}
if sum > maxsum {
maxsum = sum
}
}
return maxsum
}
本文作者:周公瑾55
本文链接:https://www.cnblogs.com/zhougongjin55/p/18354704
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
本文作者:周公瑾55
本文链接:https://www.cnblogs.com/zhougongjin55/p/18354704
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步