人人都能学会的编程入门课
胡光
原百度高级算法研发工程师
19410 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
开篇词 (1讲)
人人都能学会的编程入门课
15
15
1.0x
00:00/00:00
登录|注册

做好闭环(四):二分答案算法的代码统一结构

你好,我是胡光。
不知不觉,我们已经讲完了“算法数据结构篇”的全部内容。说是“讲完”,其实更意味着你的算法数据结构的学习之路才刚刚开始,因为编程的核心与灵魂就是算法和数据结构。但这毕竟是一个入门课,所以,整个这部分的内容,我更多是侧重说说那些你可能比较陌生的,且有趣的思维与结构。
我希望通过这个过程,能够激起你对于算法数据结构的学习热情。时至今日,我相信你应该更能深刻地理解我在开篇词里说到的,“学编程,不等于学语言“这句话的含义。
我也非常高兴,看到很多同学都在紧跟着专栏更新节奏,坚持学习。经常在专栏上线的第一时间,这些同学就给我留言,提出自己的疑惑。大部分留言,我都在相对应的课程中回复过了,而对于每节课中的思考题呢,由于要给你充足的思考时间,所以我选择在今天这样一节课中,给你进行一一的解答。
看一看我的参考答案,和你的思考结果之间,有什么不同吧。也欢迎你在留言区中,给出一些你感兴趣的题目的思考结果,我希望我们能在这个过程中,碰撞出更多智慧的火花。

重新认识数据结构(上):初识链表结构

在这一节里,我们学习了基本的链表结构,并且演示了链表结构的插入操作。最后呢,给你留了一个题目,就是实现链表的删除操作。留言区中很多人实现的代码,我也都看过了,总的来说,很多用户对“虚拟头结点”的掌握还是很不错的,下面是我给出的参考代码:
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了算法数据结构的重要性,并通过具体案例和代码示例引导读者深入理解算法数据结构的应用和实践。首先介绍了链表结构的插入、删除操作以及快乐数序列转换成链表结构的思维转换,引出了链表判环问题,并提出了计算环的长度和找到环的起始位置的思考题。此外,文章还介绍了单调栈的基本知识和应用,以及背包类动态规划算法中的0/1背包问题和多重背包问题转换技巧。通过具体的代码示例,读者可以深入理解算法数据结构的应用和实践,为进一步学习和应用算法数据结构奠定了基础。文章内容丰富,涵盖了链表、栈、动态规划等多个重要主题,对于想要深入学习算法数据结构的读者具有很高的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《人人都能学会的编程入门课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 假设从链表起始点到环的起点距离为 x,那么当快慢指针中的慢指针 p 刚刚走到环的起始点位置的时候,q 指针应该在环内部距离环起始点 x 的位置上 -------------------------------------------------------------------------- 这这句话不是很严谨,距离为 x 的一半可能大于环的长度,所以这里q的位置应该是 x % L(L为环的长度)

    作者回复: 对于这一点,文章中我做了解释。^_^

    2020-03-17
    1
  • 罗耀龙@坐忘
    茶艺师学编程 在我的工作环境下(Windows—DEV),输出结果为0。后来才发现问题出在get_dp函数的“return 0”上面,不管中间过程有多少状态值,经过这句通通变0。因此我改动了一下老师的代码,多重背包问题的可运行完整代码为: 最大值为37. #include <stdio.h> #define MAX_N 100 #define MAX_W 10000 int v[MAX_N + 5], w[MAX_N + 5], c[MAX_N + 5]; int v1[MAX_N + 5], w1[MAX_N + 5], n2 = 0; int dp[MAX_N + 5][MAX_W + 5]; // 添加一个0/1背包中的物品 void add_item(int v_value, int w_value) { n2++; v1[n2] = v_value; w1[n2] = w_value; return; } int get_dp(int n, int W) { int end; // 对多重背包中的每一种物品进行拆分 for (int i = 1; i <= n; i++) { // 采用二进制拆分法 for (int k = 1; k <= c[i]; c[i] -= k, k <<= 1) { add_item(k * v[i], k * w[i]); } if (c[i]) add_item(c[i] * v[i], c[i] * w[i]); } // 按照0/1背包的方式进行求解 for (int i = 1; i <= n2; i++) { for (int j = 1; j <= W; j++) { dp[i][j] = dp[i - 1][j]; if (j < w1[i]) continue; if (dp[i - 1][j - w1[i]] + v1[i] < dp[i][j]) continue; dp[i][j] = dp[i - 1][j - w1[i]] + v1[i]; end = dp[i][j]; } } printf("最大值为 %d", end); } int main(){ puts("请按顺序输入物品的价值v,重量w,数量c:"); for (int i = 1; i <= 4; i++){ scanf("%d %d %d", &v[i], &w[i], &c[i]); } get_dp(4, 15); return 0; }
    2020-10-24
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部