算法D1 | 704. 二分查找,27. 移除元素

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

视频讲解:https://www.bilibili.com/video/BV1fA4y1o715

博客心得:左闭右开 [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

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值