掘金4月刷题打卡活动小结——双指针题目指北

566 阅读2分钟

前言

掘金社区老玩家了,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)级别的