4.19算法

embedded/2024/10/21 7:34:12/

目录

leetcode455分发饼干

题目:

示例:

解题思路:

代码实现:

leetcode53:最大子数组和

题目:

示例:

解题思路:

代码实现:


leetcode455分发饼干

题目:

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

示例:

示例 1:

输入: g = [1,2,3], s = [1,1]
输出: 1
解释: 
你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。
所以你应该输出1。

示例 2:

输入: g = [1,2], s = [1,2,3]
输出: 2
解释: 
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.

提示:

  • 1 <= g.length <= 3 * 104
  • 0 <= s.length <= 3 * 104
  • 1 <= g[i], s[j] <= 231 - 1

解题思路:

为了满足更多的小孩,就不要造成饼干尺寸的浪费。

大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。

这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩

可以尝试使用贪心策略,先将饼干数组和小孩数组排序。

然后从后向前遍历小孩数组,用大饼干优先满足胃口大的,并统计满足小孩数量。

想清楚局部最优,想清楚全局最优,感觉局部最优是可以推出全局最优,并想不出反例,那么就试一试贪心

代码实现:

int cmp(int* a, int* b) {return *a - *b;
}int findContentChildren(int* g, int gSize, int* s, int sSize) {qsort(g, gSize, sizeof(int), cmp);qsort(s, sSize, sizeof(int), cmp);int m = gSize, n = sSize;int count = 0;for (int i = 0, j = 0; i < m && j < n; i++, j++) {while (j < n && g[i] > s[j]) {j++;}if (j < n) {count++;}}return count;
}

leetcode53:最大子数组和

题目:

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组

是数组中的一个连续部分。

示例:

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

解题思路:

贪心解法

贪心贪的是哪里呢?

如果 -2 1 在一起,计算起点的时候,一定是从 1 开始计算,因为负数只会拉低总和,这就是贪心贪的地方!

局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”

局部最优的情况下,并记录最大的“连续和”,可以推出全局最优

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。

这相当于是暴力解法中的不断调整最大子序和区间的起始位置

代码实现:

int maxSubArray(int* nums, int numsSize){int maxVal = INT_MIN;int subArrSum = 0;int i;for(i = 0; i < numsSize; ++i) {subArrSum += nums[i];// 若当前局部和大于之前的最大结果,对结果进行更新maxVal = subArrSum > maxVal ? subArrSum : maxVal;// 若当前局部和为负,对结果无益。则从nums[i+1]开始应重新计算。subArrSum = subArrSum < 0 ? 0 : subArrSum;}return maxVal;
}


http://www.ppmy.cn/embedded/6570.html

相关文章

微服务OR单体架构

微服务OR单体架构 为什么会出现微服务和单体架构的争议&#xff1f;在实际的业务中&#xff0c;你选择的是微服务还是单体架构&#xff1f;在云上&#xff0c;哪种架构更符合未来云的发展趋势呢? 说到微服务OR单体架构&#xff0c;其实这两个场景并不存在很明确的争议界限的&a…

革新鞋服零售:数据驱动的智能商品管理 解锁库存优化与高效增长

国内鞋服零售企业经过多年的发展&#xff0c;已经形成诸多家喻户晓的品牌&#xff0c;但近年来一些企业的库存问题也时常显现&#xff0c;高库存不仅困扰着品牌商&#xff0c;也使一些多年合作良好的经销商深受其害&#xff0c;当下的订货会制度在初期帮助企业解决了盲目生产的…

移植speexdsp到OpenHarmony标准系统⑥

九、准备好上传speexdsp至OpenHarmony仓库。 移植完成后&#xff0c;先将代码上传至sig仓中的contest仓 sig仓库是TPC仓库的孵化仓。代码先上sig仓&#xff0c;到时会直接平移到tpc仓。 上传的内容包括&#xff1a; 原生库代码 &#xff08;除了涉及需要修改原生库代码的部分…

【LeetCode热题100】【二分查找】搜索旋转排序数组

题目链接&#xff1a;33. 搜索旋转排序数组 - 力扣&#xff08;LeetCode&#xff09; 同样是要在数组中查找元素&#xff0c;不同的是这次的数组是这样//的&#xff0c;升序数组&#xff0c;但是往前移动了一下&#xff0c;也就是两段升序&#xff0c;456123这样 看了一位天才…

Javaweb知识之AJAX的概念的通俗理解(包含axios)

AJAX 一.概念&#xff1a; AJAX&#xff08;Asynchronous JavaScript And XML&#xff09;&#xff1a;异步的JavaScript和XML 异步 JavaScript的理解&#xff1a;就像你给朋友发了一条消息&#xff0c;然后继续做其他事情一样。你不需要等待朋友回复&#xff0c;可以继续做自…

c/c++的关键字 inline 介绍

c/c C和C是两种非常流行的编程语言&#xff0c;它们在许多方面有相似之处&#xff0c;但也存在一些关键的区别。以下是C和C的一些主要特点和差异&#xff1a; C语言的特点&#xff1a; 过程式编程&#xff1a;C是一种过程化的语言&#xff0c;强调过程和函数的使用。 简洁高效…

设计模式之模板方法模式详解(上)

模板方法模式 1&#xff09;概述 1.定义 定义一个操作中算法的框架&#xff0c;而将一些步骤延迟到子类中&#xff0c;模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 2.方案 背景&#xff1a;某个方法的实现需要多个步骤&#xff08;类似…

科目一笔记

扣分 目前只有 12 9 6 3 1分。 扣1分的 会车 不按照规定会车&#xff0c; 普倒掉&#xff08;普通路上不按规定掉头&#xff0c;倒车&#xff09; ​ 高速、城市快速路…以外的道路 普通路 ​ 校车…以外的道车 普通车 使用灯光 ​ 需要注意的是只有不按规定使用灯光&…