代码随想录刷题记录

数组

二分查找(二分法)

  • 二分法返回什么?

当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。

你可能感兴趣的:(leetcode,算法,数据结构)