目录
一、笔记(从别的博客里面补充了一些进来 特别感谢博主: lloil 和 houjingyi233 两位大佬)
一、笔记(从别的博客里面补充了一些进来 特别感谢博主: lloil 和 houjingyi233 两位大佬)
我觉得光靠看这些文字描述性的东西实在是难以真正应用,还得靠多做题多积累,我去瞄了一眼常见题型,还真难emmm慢慢学吧。
1.基本概念
作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。(整体不一定最优,但很接近)
2.基本要素
1)贪心选择性质:一系列局部最优的选择。(证明具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解)。
在解决子问题时,动态规划算法(自底向上),而贪心算法(自顶向下) 以迭代的方式作出相继的贪心选择,每作一次贪心选择就将所求问题简化为规模更小的子问题。
2)最优子结构性质:一个问题的最优解包含其子问题的最优解。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。
3.基本思路
从问题的某一初始解出发;
while 能朝给定总目标前进一步
do 求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解;
4.解题策略
1)建立数学模型来描述问题;
2)把求解的问题分成若干个子问题;
3)对每一子问题求解,得到子问题的局部最优解;
4)把子问题的局部最优解合成原来问题的一个解。
二、题解
1.最大乘积差
字面含义:最大的两个减去最小的两个,插值肯定最大
(我这个大智儿居然犯了一个低级错误,就是qsort的第一个参数居然写的不是数组名!!!导致执行错误)
2.三角形的最大周长
这题是昨天的选做题里面的,关键在于筛选出能组成三角形的三边(倒着来筛选)
(笨蛋TT又在哪里翻车了:还是 i 的范围设置那里,要注意正确设置循环的临界条件,i>=2 是对的,因为是从零开始计数的;还有就是for 的外面一定要有一个return,不然也会报错)
3.数组拆分 I
主要是题意理解,两两凑一对的话,如果要是每一对的最小值相加最大,那么应该是把大小相邻的数排在一起比较好,这样才能不浪费大的数字。然后又是从零开始计数,所以就选取偶数项作为最小数之和。
(这道题一次过,没报错,真好!)
4.救生艇
先排序,然后分三种情况讨论:只剩一人;最重的人带不上别人,独坐一只船,变为 n-1;(理想状态)最重的人加最轻的人,变为 n-2 。
我的思路是用两个变量 left 和 right 分别从两端开始,指向中间,然后再按照上面的情况做判断,over~
(注:break要单独写一个分号,不能和别的语句混在一起)
5.摆动排序 II
参考方法是 插孔
以下是关键:
先码住完整代码:
6.分发饼干
这道题的思路有点像救生艇,也是搞两个指标过来然后逐个靠近
(一开始执行错误了好多遍,愣是找不到错误,仔细看了看才发现是qsort的第二个数组名打错了,所以说千万要小心啊啊啊!!)
7.最少操作使数组递增
一开始有点没看懂
难点主要集中在这里:
完整代码:
另一种思路:
直接用数组下标操作,具体的我有空再敲一敲哈哈
8.有效三角形的个数
这是一道好题啊,先来看看我的错误解答(错因:没看清题目,误以为还是之前的最大周长三角形,所以求少了)
以下才是正解:(关键步骤 )
如何理解:
大佬的完整解答:
《算法零基础100讲》介绍(介绍部分来自@Amy卜bo皮 感谢Amy姐)
该栏目是CSDN@英雄哪里出来大佬的万人千题计划第一阶段,其目标是让想要学会算法的人抱团成长,能通过这个项目稳步成长,扎扎实实掌握算法,最终用算法改变世界!
大佬将算法学习的路线总结如下,并分别根据五步路线总结写出了相应的教学内容,关于目前的第一阶段算法入门的详细的介绍可以看博文《万人千题:第一阶段,算法零基础抱团打卡》学习路线指引
100讲的学习大纲如下: