leetcode 15. 三数之和
解题思路
利用双指针将时间复杂度从O(N^3)降为O(N^2)
时间复杂度
O(N^2)
空间复杂度
O(N)
代码
1 | class Solution: |
利用双指针将时间复杂度从O(N^3)降为O(N^2)
O(N^2)
O(N)
1 | class Solution: |
排序后相等的字符串,划归为一组
O(n*mlogm) (n:字符串个数;m:字符串长度)
O(n*m) (n:字符串个数;m:字符串长度)
1 | from collections import defaultdict |
模拟
O(mn)
O(mn)
1 | class Solution: |
对于一个长度为N的数组,缺失的第一个正数在[1, N+1]中(若[1,N]在数组都出现了,那么答案是N+1),否则答案是[1,N]中没有出现的最小正数
1 | class Solution: |
同 leetcode 236. 二叉树的最近公共祖先 方法1
1 | """ |
1 | class Solution: |
获取每个节点的父节点
记录p所有的祖先节点
q节点不断向祖先移动,若有祖先在p的祖先节点中,则该祖先为p、q的最近公共祖先
O(n)
O(n)
1 | # Definition for a binary tree node. |
两种情况:
1、p不是q的祖先节点(反之亦然)
从root结点开始遍历节点,若存在节点,p(或q)在其左子树找到 且 q(或p)在其右子树找到,则该节点就是p、q的最近公共祖先
2、p是q的祖先节点(反之亦然)
从root结点开始遍历节点,若存在节点等于p(或q),则该节点就是p、q的最近公共祖先
O(n)
O(n)
1 | # Definition for a binary tree node. |
下标[0, i]的子数组和
下标[j, i]的子数组和为k的倍数 (j<i)
<=>
pre[i]-pre[j-1] == n*k
<==>
pre[i] == n1*k + rem1
pre[j] == n2*k + rem2
rem1 == rem2
<==>
通过计算第i个元素前,是否有pre%k等于pre[i]%k,即说明存在以i结尾的子数组和为k的倍数
O(n)
O(min(n,k))
1 | class Solution: |
下标[0, i]的子数组和
下标[j, i]的子数组和为k <=> pre[i]-pre[j-1] == k <==> pre[j-1] == pre[i]-k (注意:j <= i)
通过计算第i个元素前,有多少个pre等于pre[i]-k,可得到以第i个元素结尾的和为k的子数组个数
遍历n个元素,累加和为k的子数组个数,即可得到答案
O(n)
O(n)
1 | from collections import defaultdict |