代码随想录-数组-01
代码随想录数组 01
1. 704.二分查找
题目链接: LeetCode 704. 二分查找
使用条件
二分查找需要满足以下条件:
- 数组为有序数组
- 数组中无重复元素
核心原则
二分法要遵循循环不变量原则,在循环中每一次的边界处理都要坚持根据区间的定义来操作,例如是左闭右开 [left, right) 还是左闭右闭 [left, right],这点要分清楚。
我的解法
1 | func search(nums []int, target int) int { |
Carl 的题解
1 | // 时间复杂度: O(log n) |
复杂度分析
| 复杂度 | 值 |
|---|---|
| 时间复杂度 | O(log n) |
| 空间复杂度 | O(1) |
2. 27.移除元素
题目链接: LeetCode 27. 移除元素
解法:双指针法(快慢指针)
1 | func removeElement(nums []int, val int) int { |
核心思路
- 慢指针
count: 指向下一个有效元素要放置的位置 - 快指针
i: 遍历整个数组 - 逻辑: 遇到不等于
val的元素就移到前面
复杂度分析
| 复杂度 | 值 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(1) |
3. 977.有序数组的平方
题目链接: LeetCode 977. 有序数组的平方
解法:双指针法
1 | func sortedSquares(nums []int) []int { |
核心思路
- 数组已排序,但可能包含负数
- 平方后最大值一定在数组两端(最小负数或最大正数)
- 双指针从两端向中间移动,比较平方值
- 从后往前填充结果数组,保证有序性
复杂度分析
| 复杂度 | 值 |
|---|---|
| 时间复杂度 | O(n) |
| 空间复杂度 | O(n) |
为什么从后往前填充?
1 | 示例: nums = [-4, -1, 0, 3, 10] |
总结
关键技巧
二分查找:
- 坚持循环不变量原则
- 注意边界条件
[left, right] - 防止溢出:
mid = left + (right - left) / 2
双指针法:
- 快慢指针:原地修改数组
- 对撞指针:从两端向中间
- 适用于有序数组问题
时间复杂度优化:
- 二分查找:O(log n)
- 双指针:O(n),优于暴力 O(n²)
学习资源
更新日期: 2026-02-11
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.