Python 用了很多年,但是对于数据结构与算法一直理解不够深刻。近期想系统性的过一遍,顺道练习C++。所有的题目会先用Python写一遍,再用C++写一遍。
D1 数组理论基础
文章链接:https://programmercarl.com/%E6%95%B0%E7%BB%84%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html
题目建议: 了解一下数组基础,以及数组的内存空间地址,数组也没那么简单。
704. 二分查找
题目建议: 大家能把 704 掌握就可以,35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。
先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。
题目链接:https://leetcode.cn/problems/binary-search/
文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html
博客心得:左闭右开 [left, right) 和左闭右闭 [left, right] 的区别是之前没有考虑过的。The devil in the details.
先看了博客,以为对于二分查找很熟悉了,但是抠到细节,发现没有总结过思路,先练习了一下左闭右开的写法,发现对于指针的位置判断不够精确竟然也会引起报错。以前的思路是:模糊的尽可能多的包含被查找的区间,这样不会遗漏,可是这样也带来了新的问题: 永远都无法收敛到目标位置,无法结束循环。debug的时候,发现这种不精确的写法在第二轮就找到了目标值,但是没有终止循环。(highlight: line13-14)
Python 写法一: 左闭右开
Python 写法二: 左闭右闭
第一种写法理解了以后,再写左闭右闭就简单了,关键是把区间节点搞清楚,区别在于line24,27,29, 注释标记的新区间范围是关键。整体感觉方法二比较直观,区间范围就是写出来的位置,不用绕一下看是否需要把左右端点写入新的区间。
C++ 写法一: 左闭右开
看了一下C++基础教程:https://www.runoob.com/cplusplus/cpp-variable-types.html
实操写起来和python逻辑一致,主要是语法练习,理论教程看一遍领悟不深,真正开始用起来还是面向Google编程。
cpp和python的区别:在首次使用变量时,需要申明每一个变量的类型;cpp中的else if 对应python中的elif; 每一行结束以分号(;)为标志。windows调试cpp需要配置环境,暂时先写leetcode平台版本。
C++写法二: 左闭右闭
27. 移除元素
题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。
题目链接:https://leetcode.cn/problems/remove-element/
文章讲解:https://programmercarl.com/0027.%E7%A7%BB%E9%99%A4%E5%85%83%E7%B4%A0.html
视频讲解:https://www.bilibili.com/video/BV12A4y1Z7LP
这个题目最近做过,补充一个时间复杂度O(n), 空间复杂度O(n)的思路,单指针,每次都修改当前指针及其后面所有的元素。注意审题,需要返回保留元素k的,也就是循环结束后的slow指针。
快慢指针还是比较直观的,Python写法如下:
C++ 写法如下:
C++中换成了用forloop写,这样不用在每次循环对fast指针+1, 更简洁一些。
另外尝试了新的vector的size的获取方式:1. size(nums); 2 nums.size();
vector.size()的返回值是vector动态数组容器的尺寸大小,也就是内部元素个数;nums.size() 是 vector 类的成员函数,size() 是一个模板函数,可以用于任何有size成员的容器;成员函数(nums.size())使用更广泛一些。
另: size/sizeof/length 的区别: https://blog.csdn.net/2303_79299383/article/details/134684749?spm=1001.2101.3001.6650.3&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-3-134684749-blog-121202223.235%5Ev40%5Epc_relevant_3m_sort_dl_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EYuanLiJiHua%7EPosition-3-134684749-blog-121202223.235%5Ev40%5Epc_relevant_3m_sort_dl_base3&utm_relevant_index=6