代码随想录刷题记录

数组

二分查找(二分法)

  • 二分法返回什么?

当i=j时,相遇点之前一定比target小,相遇点之后一定比target大。此时,只有相遇点与target大小关系未知。
最终,i一定会指向第一个比target大的点,即i左边都比target小。
j一定会指向第一个比target小的点,即j右边都比target大。 根据题目要求返回所需数据。

  • 临界条件

例如到底是 while(left < right) 还是 while(left <= right),到底是right = middle呢,还是要right = middle - 1呢?
区间的定义没有想清楚,区间的定义就是不变量。

34. 在排序数组中查找元素的第一个和最后一个位置
69.x 的平方根 (牛顿迭代法)

移除元素(双指针)

  • 确定快慢指针具体含义

力扣27. 移除元素
快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针左边所有元素都满足要求,指向更新 新数组下标的位置

80. 删除有序数组中的重复项 II
快指针:寻找新的满足要求的元素
慢指针左边所有元素都满足要求,指向更新 新数组下标的位置
ps:这道题里满足要求的判断:nums[fast] != nums[slow-k] 还有特殊情况:slow - k < 0。故满足要求的为:slow < k || nums[fast] != nums[slow - k]。满足要求的将被赋值给满指针即:nums[slow++] = nums[fast] 因为加入fast满足条件,fast将被复制到slow位置,slow位置必须不等于slow - k位置。

哈希表

集合底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::set红黑树有序O(log n)O(log n)
std::unordered_set哈希表无序O(1)O(1)

std::unordered_set底层实现为哈希表,std::set 和std::multiset 的底层实现是红黑树,红黑树是一种平衡二叉搜索树,所以key值是有序的,但key不可以修改,改动key值会导致整棵树的错乱,所以只能删除和增加。

映射底层实现是否有序数值是否可以重复能否更改数值查询效率增删效率
std::map红黑树key有序key不可重复key不可修改O(logn)O(logn)
std::multimap红黑树key有序key可重复key不可修改O(log n)O(log n)
std::unordered_map哈希表key无序key不可重复key不可修改O(1)O(1)

std::unordered_map 底层实现为哈希表,std::map 和std::multimap 的底层实现是红黑树。同理,std::map 和std::multimap 的key也是有序的(这个问题也经常作为面试题,考察对语言容器底层的理解)。

当我们要使用集合来解决哈希问题的时候,优先使用unordered_set,因为它的查询和增删效率是最优的,如果需要集合是有序的,那么就用set,如果要求不仅有序还要有重复数据的话,那么就用multiset。

双指针

双指针法才展现出效率的优势:通过两个指针在一个for循环下完成两个for循环的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值