1.四个复杂度
- 时间复杂度
- 空间复杂度
- 编程复杂度 —— 看得懂
- 思维复杂度 —— 想得出
2.时间复杂度
- 只考虑最高项
- 不考虑常数项和系数
- 时间复杂度为O(n)的算法:双指针算法、打擂台算法、单调栈算法...
注:
- 快速排序的最坏情况很罕见,因而其时间复杂度是期望值O(nlogn)
- 利用时间复杂度倒推算法是面试常用技巧
3.三种双指针算法
- 相向双指针
- 背向双指针
- 同向双指针
4.相向双指针
1) valid palindrome
判断一个字符串忽略大小写和非法字符后是否为回文串?
解:用到了Character类下isLetter(), isDigit(), toLowerCase(), toUpperCase()静态方法
2) valid palindrome 变型
是否可以在去掉一个字符的情况下是一个回文串?
解:贪心算法,当左右两指针向中间靠拢时遇到不相等的情况,去掉左指针对应的字符或去掉右指针对应的字符,判断余下的子串是否为回文串。
涉及多个返回值,java需要返回多个值时,需要新建一个类,返回该instance
注:空字符串 指的是长度为0的字符串,即String s = ""
3) Two Sum 两数之和
在未排序数组中,找到两数之和等于给定的target?
解法一:哈希表,HashSet / HashMap 时间复杂度O(n),空间复杂度O(n)
注:哈希表搜索、插入、删除的时间复杂度都为O(1)
解法二:排序+双指针 时间复杂度O(nlogn), 空间复杂度O(1)
5. 相关例题
leetcode:125. 验证回文串,680. 验证回文字符串 Ⅱ,1. 两数之和
lintcode:609 · 两数和-小于或等于目标值
6.补充
1)java初始化数组
datatype[] referVar = new datatype[]{var0, var1, ..., varN};
或 datatype[] referVar = new datatype[n];
2)数组长度是arr.length,字符串长度是s.length()
3)Arrays.sort(arr) 对数组排序,改变了原数组
7. 引申
1)了解哈希表hashset/hashmap搜索、添加、删除的时间复杂度为O(1)的原理?