代码随想录算法训练营第一天 | 数组Part01
LeetCode704.二分查找
题目要点与解题思路
首先我们明确一下二分查找的条件:
- 数组是有序的
- 数组中没有重复元素(否则返回的下标可能会不唯一)
然后要注意二分查找的边界条件,有两种写法,左闭右开和左闭右闭,我是用的左闭右闭的写法。
实现代码
1 | class Solution { |
- 时间复杂度
- 空间复杂度
遇到的问题与总结
注意两个地方:
left <= right
,这个是二分查找的条件,左闭右闭中是小于等于else if (target < nums[mid])
right = mid - 1;
LeetCode27.移除元素
题目要点与解题思路
乍一看会想到用两层 for 循环,第一层检测要删除的元素,第二层是一个个位移填补空缺,这样是
我们希望能优化到
双指针法(快慢指针法): 通过一个快指针和慢指针在一个 for 循环下完成两个 for 循环的工作。
- 快指针:寻找符合条件的元素位置
- 慢指针:定位更新的位置
这样讲有点抽象,直接看代码
实现代码
1 | class Solution { |
- 时间复杂度
- 空间复杂度
当 fast 发现元素不是 val 的时候,会把现在的 fast 赋给现在的 slow,并且 slow 也往前进。如果 fast 指向要删除的元素,就会把 fast 只会管自己往前走,此时 slow 就停下来了,等待下一个 fast 指向的非 val 的元素
遇到的问题与总结
第一次遇到想不到用双指针
本题是双指针的经典应用,很多数组问题中都可以使用双指针进行优化,必须很清楚两个指针都代表什么含义
LeetCode977.有序数组的平方
题目要点与解题思路
想要在 O(n)的时间复杂度内完成这个题目,我们可以使用双指针法。
平方其实是个二次函数,最大的值会出现在两端,所以可以用左右两个指针不断向中间进行遍历,然后开辟一个新的数组,从后往前接住两个指针中较大的值的平方。
实现代码
1 | class Solution { |
- 时间复杂度
- 空间复杂度
遇到的问题与总结
注意 i<=j,如果没有等号,此位置的元素会被遗漏而没有填入到 result 中。
今日总结
今天是代码随想录训练营打卡第一天,温故了一下前段时间做的题目,很有收获!