复杂度&双指针算法

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)的原理?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值