前言
掘金社区老玩家了,16年加入,天天灌水,最近恰好在Leetcode和Lintcode刷题目,今天在掘金也碰上掘金4月刷题打卡活动,就顺手参加了。
此次活动的题目都来自于个人的刷题笔记。本文的意义在于总结双指针类的问题以及心得和收获,如双指针类型、双指针的复杂度分析等。
正文
此次15篇题目都是双指针的题目,主要包括了双指针入门题目,双指针拓展,双指针应用,以及与划分算法综合运用的题目,都是很容易理解也能很快上手的题目。
| 标题 | 介绍 |
|---|---|
| LeetCode两数之和 | 简单的双指针入门 |
| LeetCode两数之和 II | 简单的双指针入门 |
| LeetCode两数之和 III-输入有序数组 | 简单的双指针入门 |
| LeetCode两数和-小于或等于目标值 | 简单的双指针入门 |
| LeetCode两数之和 III-数据结构设计 | 简单的双指针提升,数据结构综合 |
| LeetCode两数和的最接近值 | 简单的双指针提升,打擂台综合 |
| LeetCode两数之和 - 不同组成 | 简单的双指针提升,去重判等边界处理 异常情况综合 |
| LeetCode三数之和 | 简单的双指针提升,换元综合 |
| LeetCode有效三角形的个数(三角形计数) | 较难的双指针应用,抽象问题综合 |
| LeetCode颜色分类 | 较难的双指针应用,抽象问题综合 |
| LeetCode交错正负数 | 较难的双指针应用,划分综合 |
| LeetCode移动零 | 简单的双指针提升,划分综合 |
| LeetCode无序数组K小元素 | 较难的双指针应用,三指针拓展,划分综合 |
| LeetCode数组划分 | 较难的双指针应用,划分综合 |
| LeetCode 排序数组 | 较难的双指针应用,划分综合,排序综合 |
双指针小结
双指针题目类型
%%{init: {'theme': 'base', 'themeVariables': { 'primaryColor': '#ffcccc', 'edgeLabelBackground':'#ffffee', 'tertiaryColor': '#fff0f0'}}}%%
graph LR
head(双指针类型)-->a(相向双指针)
head(双指针类型)-->b(背向双指针)
head(双指针类型)-->c(同向双指针)
a-->a1(Reverse型)-->a11(翻转字符串)
a1(Reverse型)-->a12(判断回文串)
a-->a2(TwoSum型)-->a21(两数之和)
a2(TwoSum型)-->a22(三数之和)
a-->a3(Partition型)-->a31(快速排序)
a3(Partition型)-->a32(颜色排序)
b-->b1(最长回文串中心枚举法)
b-->b2(二分法中寻找k个最近元素)
c-->c1(滑动窗口类)
c-->c2(快慢指针类)
双指针使用条件
| 出现关键字 | 双指针使用概率 |
|---|---|
| 滑动窗⼝ | 90% |
| 时间复杂度要求 O(n) | 80% |
| 要求原地操作,只可以使⽤交换,不能使⽤额外空间 | 80% |
| 有⼦数组 subarray /⼦字符串 substring 的关键词 | 50% |
| 有回⽂ Palindrome 关键词 | 50% |
双指针复杂度计算
式1
int a = 0;
for (int i = 0; i < n; i++){
for (int j = 0; j < n; j++){
a += 1;
}
}
1+2+3+…+n=n(n-1)/2=n^2
式2
int a = 0;
for (int i = 1; i < n; i++){
for (int j = 1; j < n / i; j++){
a += 1;
}
}
T(n) = n + n/2 + n/3 + n/4 + ... + n/n,而根据数学知识,这一部分求和的结果的下界是nln(n)。因此时间复杂度是O(nlogn)级别的