剑指 Offer II 101. 分割等和子集
bool canPartition(vector& nums) {
int sum=0;
for(int i=0;i=nums[i-1];j--){
// cout<
剑指 Offer II 102. 加减的目标值
bool canPartition(vector& nums) {
int sum=0;
for(int i=0;i=nums[i-1];j--){
// cout<
剑指 Offer II 103. 最少的硬币数目
int coinChange(vector& coins, int amount) {
int n=coins.size();
long f[amount+1];
memset(f,0,sizeof(f));
for(int j=0;j<=amount;j++)
f[j]=INT_MAX;
f[0]=0;
for(int i=1;i<=n;i++){
for(int j=coins[i-1];j<=amount;j++){
f[j]=min(f[j],f[j-coins[i-1]]+1);
}
}
if(f[amount]==INT_MAX) return -1;
return f[amount];
}
剑指 Offer II 104. 排列的数目
注意这里如果用二维想法->前i个表示体积前j个表示前j个种类是区别不了组合数的,结果和前i个表示种类前j个表示前j个体积一样!!!如果想表示组合数则要化为一位数组。若要用二维解题可以用--->f[i][j]:所有从前i个位置中选,且总体积恰好是j的所有方案。这种想法解题,但是这种会多出一维出来。
int res=0;
int combinationSum4(vector& nums, int target) {
int n=nums.size();
nums.insert(nums.begin(),0);
int f[target+1];
memset(f,0,sizeof(f));
f[0]=1;
for(int i=1;i<=target;i++){
for(int j=1;j<=n;j++){
if(i>=nums[j]&&f[i] < INT_MAX - f[i - nums[j]]) f[i]+=f[i-nums[j]];
}
}
return f[target];
}
二维:
int combinationSum4(vector& nums, int target) {
int n=nums.size();
nums.insert(nums.begin(),0);
int f[target+1][target+1];
memset(f,0,sizeof(f));
for(int i=0;i<=target;i++) f[i][0] =1;
for(int i=1;i<=target;i++){
for(int j=1;j<=target;j++){
for(int k=1;k<=n;k++){
if(j>=nums[k]&&f[i][j]
剑指 Offer II 105. 岛屿的最大面积
int maxAreaOfIsland(vector>& grid) {
int res=0;
int n=grid.size(),m=grid[0].size();
int sum=0;
vector> st(n,vector(m));
for(int i=0;i>grid,vector>& st){
int n=grid.size(),m=grid[0].size();
for(int i=0;i<4;i++){
int X=x+dx[i],Y=y+dy[i];
if(X>=n||X<0||Y>=m||Y<0||st[X][Y]||grid[X][Y]==0) continue;
sum++;
st[X][Y]=true;
dfs(X,Y,sum,grid,st);
}
}
剑指 Offer II 106. 二分图
vectorcolor;
bool isBipartite(vector>& graph) {
for(int i=0;i> graph){
color[u]=c;
for(int i=0;i
int ladderLength(string beginWord, string endWord, vector& wordList) {
unordered_map dist;
unordered_map map;
wordList.push_back(beginWord);
for(int i=0;i q;
q.push(beginWord);
dist[beginWord]=1;
while(q.size()){
auto cc=q.front();
q.pop();
string ori=cc;
for(int i=0;i
剑指 Offer II 108. 单词演变
int ladderLength(string beginWord, string endWord, vector& wordList) {
unordered_map dist;
unordered_map map;
wordList.push_back(beginWord);
for(int i=0;i q;
q.push(endWord);
dist[endWord]=1;
while(q.size()){
auto cc=q.front();
q.pop();
string ori=cc;
for(int i=0;i
剑指 Offer II 109. 开密码锁
int openLock(vector& deadends, string target) {
int res=0;
unordered_map map;
unordered_map dist;
for(int i=0;iq;
q.push("0000");
dist["0000"]=1;
while(q.size()){
auto cc=q.front();
q.pop();
string ori=cc;
for(int i=0;i<4;i++){
cc=ori;
if(cc[i]=='9') cc[i]='0';
else cc[i]++;
if(!map[cc]&&!dist[cc]){
dist[cc]=dist[ori]+1;
if(cc==target) return dist[cc]-1;
q.push(cc);
}
cc=ori;
if(cc[i]=='0') cc[i]='9';
else cc[i]--;
if(!map[cc]&&!dist[cc]){
dist[cc]=dist[ori]+1;
if(cc==target) return dist[cc]-1;
q.push(cc);
}
}
}
return -1;
}
剑指 Offer II 110. 所有路径
vector> res;
int n;
vector> allPathsSourceTarget(vector>& graph) {
if(graph.size()==0||graph[0].size()==0) return res;
n=graph.size()-1;
vectorxx;
xx.push_back(0);
dfs(0,graph,xx);
return res;
}
void dfs(int u ,vector> graph,vector xx){
if(xx.back()==n){
res.push_back(xx);
return ;
}
for(int i=0;i
剑指 Offer II 111. 计算除法
map,double> map;
unordered_map f;
vectorres;
vector calcEquation(vector>& equations, vector& values, vector>& queries) {
for(int i=0;i pss,pssf;
pss.first=equations[i][0];pssf.first=equations[i][1];
pss.second=equations[i][1];pssf.second=equations[i][0];
map[pss]=values[i];
map[pssf]=1.0/values[i];
f[equations[i][0]]=true;
f[equations[i][1]]=true;
}
for(int i=0;i st;
vector u=queries[i];
string aa=u[0],bb=u[1];
int sz=res.size();
if(!f[aa]||!f[bb]) res.push_back(-1);
else if(aa==bb&&f[aa]) res.push_back(1);
else {
if(i==queries.size()-1) cout<& st){
if(aa==bb) {
res.push_back(xx);
return 1;
}
for(auto cc: map){
if(st[aa]) continue;
if(cc.first.first!=aa) continue;
st[aa]=true;
if(dfs(cc.first.second,bb,xx*cc.second,st)) return 1;
st[aa]=false;
}
return 0;
}
剑指 Offer II 112. 最长递增路径
int n,m;
int cnt=0;
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};
vector> dist;
vector> g;
int longestIncreasingPath(vector>& matrix) {
g=matrix;
if (matrix.empty()) return 0;
n=matrix.size(),m=matrix[0].size();
dist=vector>(n,vector(m,0));
int res=1;
for(int i=0;i=n||y<0||y>=m||g[x][y]<=g[X][Y]) continue;
dist[X][Y]=max(dist[X][Y],dfs(x,y)+1);
}
return dist[X][Y];
}
剑指 Offer II 113. 课程顺序
vector findOrder(int numCourses, vector>& p) {
unordered_map> map;
int n=p.size();
vector d(numCourses);
int head=0;
int tt=-1,hh=0;
for(int i=0;i q;vector res;
for(int i=0;i
剑指 Offer II 114. 外星文字典
unordered_map map;
string alienOrder(vector& words) {
int cnt=0;
int f[26]={0};
int d[26]={0};
queue q;
string res;
for(int i=0,j=1;jwords[j].size()){
cout<<"xx";
return "";
}
}
for(int i=0;i
剑指 Offer II 115. 重建序列
bool sequenceReconstruction(vector& nums, vector>& p) {
unordered_map> map;
vector d(nums.size()+1);
for(int i=0;i=1) return false;
int cc=q[hh++];
if(cc!=nums[loc++]) return false;
for(int i=0;i
剑指 Offer II 116. 省份数量
int res=0;
vectorst;
vector> p;
int n,m;
int findCircleNum(vector>& pp) {
p=pp;
n=p.size(),m=p[0].size();
st=vector(n);
for(int i=0;i
剑指 Offer II 117. 相似的字符串
int n,m;
int res;
vectorp;
int find(int u){
if(p[u]!=u) p[u]=find(p[u]);
return p[u];
}
bool check(string aa,string bb){
if(aa==bb) return true;
vector q;
for(int i=0;i& strs) {
int n=strs.size(),m=strs[0].size();
res=n;
p=vector(n);
for(int i=0;i
剑指 Offer II 118. 多余的边
vector p;
int find(int u){
if(p[u]!=u) p[u]=find(p[u]);
return p[u];
}
vector findRedundantConnection(vector>& edges) {
int n=edges.size();
p.resize(n+1);
for(int i=1;i<=n;i++) p[i]=i;
for(auto e:edges){
int aa=find(e[0]) ,bb=find(e[1]);
if(aa!=bb) p[aa]=bb;
else return e;
}
return {};
}
剑指 Offer II 119. 最长连续序列
int longestConsecutive(vector& p) {
set q(p.begin(),p.end());
vector nums(q.begin(),q.end());
int n=nums.size();
int res=0;
for(int i=0,j=0;i