算法(1)
一、复杂发
1.常见的时间复杂度分析方法
(1):循环次数
(2)均摊分析
(3)递归式----主定理
2.复杂度:
(1)O(1):基本运算、+、 -、 *、 /、 % 、寻址
(2)O(logn) :二分查找
(3)O(n^1/2):枚举约数
(4)O(n):线性查找
(5)O(n^2):朴素最近点对
(6)O(n^3):Floyd最短路径、普通矩阵乘法
(7)O(nlogn):归并排序,快速排序的期望复杂度,基于比较排序的算法下界
(8)O(2^n):枚举全部子集
(9)总结:优秀 O(1) < O(logn) < O(n1/2) < O(n) < O(nlogn)
可能可以优化 O(n2) < O(n3) < O(2n) < O(n!)
3.将1,2,3,4.........n序列进行排序,
二、均摊分析
1. (1)多个操作,一起算时间复杂度
(2)MULTIPOP的队列,可以一次性出队k个元素
每个元素只出入队列一次
动态数组尾部插入操作(vector)
一旦元素超过容量限制,则扩大一倍,再复制
2.eg最大子数组和
给定数组a[1…n],求最大子数组和,即找出1<=i<=j<=n,
使a[i]+a[i+1]+…+a[j]最大(arrayList)。vector底层的实现是数组,数组的大小是有效的,
当数组快要放满的时候,就开辟一个原数组两倍大的空间,将原数组复制到新的数组中去
(1)暴力枚举:三重循环
(2)优化枚举:两重,去冗余
(3)贪心法 :一重循环,去冗余
class Solution: def maxSubArray(self, nums): """ :type nums: List[int] :rtype: int """ n = len(nums) ans = -10000000000000 sum =0 for i in range(n):#i=0 sum+=nums[i] if sum>ans: ans = sum if sum<0: #如果是A就把A抛弃 sum = 0 else: sum=sum #如果是B就继续保留 return ans
本算法的时间复杂度是O(n)
3.设计一个队列,支持出队、入队、求最大元素
要求O(1),均摊分析
4.给定一个正整数组,是否能以3个数构成三角形
满足a[i]<a[j]+a[k]
并且a[j]<a[i]+a[k]
并且a[k]<[i]+a[j]