数组理论基础 文章链接:代码随想录
有了代码随想录这样的好社群的契机,开始了时隔好一阵子的刷题。以前一直用java,但工作中不用java很久了。这次准备开封心仪已久的C++,刷题的同时吸收一门想要使用的新语言。
704. 二分查找
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
视频讲解:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibili
题目建议: 大家今天能把 704.二分查找 彻底掌握就可以,至于 35.搜索插入位置 和 34. 在排序数组中查找元素的第一个和最后一个位置 ,如果有时间就去看一下,没时间可以先不看,二刷的时候在看。
先把 704写熟练,要熟悉 根据 左闭右开,左闭右闭 两种区间规则 写出来的二分法。
写题的时候发现c++ 和java的写出来还是很像的, 除了签名部分。int[] nums 变为 vector<int>&。严格说来,这样也许更标准。因为java数据结构其实一般都是 HashSet<Integer> 这类格式, 所以其实vector更明确。int[] 大概是java嫌明确了麻烦 要简化什么的(待查证)
c++似乎不会一会儿.length() 一会儿.size()。 上来就都是 .size()。
java有.length, .length(), .size(),久了不写就会老记错(现在也只记得 基本一点的用.length, 带点数列类结构的 用.length(), 别的.size())
写题时候写的左闭右闭,但又踩坑了,判断while停止写成了 left < right, miss 了终止时候的部分case。
看了视频讲解又扫了一眼文章,意识到可以使用一些区间处理的原则来避免这种情况。因为左闭右闭的时候,left == right 可以包含mid值, 所以while判断一定要包含等于的情况。之后的判断也类似。
同理说来,左闭右开就不需要==, 但值得注意的是开头的right范围是size(), 而不是size() -1。贯彻区间判断的做法。
27. 移除元素
题目建议: 暴力的解法,可以锻炼一下我们的代码实现能力,建议先把暴力写法写一遍。 双指针法 是本题的精髓,今日需要掌握,至于拓展题目可以先不看。
题目链接:. - 力扣(LeetCode)
文章讲解:代码随想录
第一反应是想不起来这题目是啥了,数组怎么还能删东西,定睛一看是把要保留的元素挤到前面去然后返回长度。用快慢指针写完了,一下子还想不起来暴力解是如何。看了文章讲解发现是每次检测到target就loop到pin的size完全挪一遍。大致是习惯了快慢指针就回不去了。
截至目前学习大约3小时,查看了各类代码随想录的资料,决定同时也跟随代码随想录学习c++资料,并完成第一天两道题。 感冒错过了第一天的补卡,所以今天再留出完成第二天题目的时间,赶上进度。