算法小记【1】


1.二分图
用两种颜色为所有顶点着色,任何一条边的两个顶点颜色不同。
比如:演员和电影。

2.完全加权有向图
我们把每种货币视为图的一个顶点,货币之间的汇率视为加权有向边,那么整个汇率市场就是一副完全加权有向图。
套汇:汇率图构成的环,其上的权重之积大于1,顺着这个环交易一圈就能空手套白狼~

动态规划:Dynamic programming,DP
通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。
适用于有重叠子问题和最优子结构性质的问题,动规方法耗时远少于暴力解法。
最终结果位置dp[m][n]的三种遍历方式
1.正向遍历
for(int i=0;i<m;i++)
for(int j=0;j<n,j++)
//算dp[i][j]

2.反向遍历
for(int i=m-1;i>=0;i–)
for(int j=n-1;j>=0;j–)
//算dp[i][j]

3.斜向遍历
for(int k=2;k<=n;k++)
for(int i=0;i<n-1;i++)
int j=k+i-1;
//计算dp[i][j]

比如:凑零钱。

回溯算法
def backtrack(…):
for 选择 in 选择列表
多选择
backtrack(…)
撤销选择
比如:全排列,N皇后。

动态规范的暴力求解阶段就是回溯算法,有的问题具有重叠子问题,可以用dp table或备忘录优化,将递归树大幅剪枝,就变成了动态规划。
动规:状态、选择、base case
回溯:路径、选择列表、结束条件

二分查找
int binary_search(int[] nums, int target){
int l=0,r=nums.Length-1;
while(l<=r){
int m=l+(r-l)/2;
if(nums[m]<target){
l=m+1;
}else if(nums[m]>target){
r=m-1;
}else if(nums[m]==target){
//1.直接返回
return m;
//2.锁定左边界
r=m-1;
//3.锁定右边界
l=m+1;
}
}

//1.直接返回
return -1;

//2.锁定左边界
if(l>=nums.Length || nums[l]!=target)
    return -1;
    
//3.锁定右边界
if(r<0 || nums[r]!=target)
    return -1;

}

滑动窗口技巧
1.最小子串问题(输出:不要求连续,求包含所有字母的最小子串)
在字符串s="AD0BEC0DEBANC"中找到包含t="ABC"所有字母的最小子串。
如果不存在,返回空字符串;否则返回最小子串。
ps:使用双指针的左右指针,l和r一开始都指向s[0],把闭区间[l,r]视为一个“窗口”;
1.首先不断r++,使窗口包含t,如果不包含则不存在;(是否存在解)
2.接着把左指针向右移(l++),当区间[l,r]不包含t时,停止l,这个时候[l-1,r]这个窗口是此时的最小子串;(优化)
3.接着重复1和2两个步骤,直到右指针指向s[length-1],从每一轮的[l-1,r]窗口中选择长度最短的即为最小子串;(所有解中选最优)

2.找到字符串中所有字母异位词(输出:连续且包含所有字母的子串的起始索引)
字母异位词值字母相同,但排列不同的字符串。
s=“cbaebabacd”,p=“abc”
返回异位词子串的起始索引:[0, 6] -> 0:cba 6:bac
ps:使用双指针的左右指针,l和r一开始都指向s[0],rst=null;
1.如果rst==p,则记录l,l=r,清空rst;
2.此时rst处于清空状态,l和r指向同一元素:
如果p不包含s[r],则l++/r++;
如果p包含s[r]:
2.1 如果rst不包含,r++,rst添加s[r]并执行步骤1
2.1 如果rst包含,则l++/r++;
3.如果r移动到了最后一个元素,执行步骤1;

3.连续且无重复字符的最长子串长度
s=“pwwkewabwimna”,则最长子串长度为?
ps:使用双指针的左右指针,l和r一开始指向s[0],rst=null;len=0,le=0,re=0;
(le是最长子串时的左指针位置,re是最长子串时的右指针位置,通过这两个索引可以截取出最长子串)
1.如果右指针移动到了最后一个元素,则返回长度len;
2.如果rst不包含s[r]则添加,len=rst.Length,le=l,re=r,r++;
//步骤三有点问题
3.如果rst包含s[r]则清空,l++,如果s[l]!=s[r]则rst=s[l…r],len=rst.Length,le=l,re=r,r++,执行步骤2,
否则左指针继续右移,直到l==r时再执行步骤2;

猜你喜欢

转载自blog.csdn.net/itsxwz/article/details/128043522