演算法題 牛客研發最愛考 71 80

2021-10-20 19:10:11 字數 3616 閱讀 9912

class solution 

void

dfs(

int n,

int lc,

int rc,string seq)}}

;

記錄方案,記錄轉移狀態,這裡記錄最前面,也就是第乙個可以轉移的

class solution 

if(f[n]

[m]==0)

return

"-1"

;// 最長公共子串行記錄方案

string res;

int i = n,j = m;

while

(f[i]

[j]>0)

reverse

(res.

begin()

,res.

end())

;return res;}}

;

題解

法一:爆搜(超時)

class solution 

intdfs

(int n,

int k)

return minv +1;

}};

法二:暴搜改動態規劃,時間複雜度o(n

∗n∗k

)o(n * n * k)

o(n∗n∗

k)

class solution 

return f[n]

[k];}}

;

法三:打表,找規律

考慮n個棋子扔1.2.3.。。k次能夠解決多少層問題,打表,找規律。

class solution 

f[i]

[j]= f[i -1]

[j -1]

+ f[i-1]

[j]+1;

if(f[i]

[j]>= n)

return i;

}return0;

}};

先對區間排序,最後的時候記得把最後一段區間加入

#include

/** * definition for an interval.

* struct interval

* interval(int s, int e) : start(s), end(e) {}

* };

*/bool cmp

(interval &a,interval &b)

class solution );

st = intervals[i]

.start,ed = intervals[i]

.end;

}else ed =

max(ed,intervals[i]

.end);}

if(st !=

-2e9

) ans.

push_back()

;// 把最後一段區間加入

return ans;}}

;

class solution 

return res == x || res /

10== x;}}

;

題解

class solution 

};

/**

* struct treenode ;

*/class solution ;}

bool dfs1

(treenode *root,

long

long minv,

long

long maxv)

// 判斷是否是二叉搜尋樹

bool dfs2

(treenode *root)

// 判斷是否是完全二叉樹

};

判斷是否是二叉搜尋樹的迭代版本

/**

* definition for a binary tree node.

* struct treenode

* treenode(int x) : val(x), left(nullptr), right(nullptr) {}

* treenode(int x, treenode *left, treenode *right) : val(x), left(left), right(right) {}

* };

*/class solution

root = stk.

top();

stk.

pop();

if(root->val <= inorder)

return false;

inorder = root->val;

root = root->right;

// 轉向右邊

}return true;}}

;

方法二:尋找鍊錶中點 + 鍊錶逆序 + 合併鍊錶

/**

* definition for singly-linked list.

* struct listnode

* listnode(int x) : val(x), next(nullptr) {}

* listnode(int x, listnode *next) : val(x), next(next) {}

* };

*/class solution

//cout << slow->val; 1. 看中點是否正確

auto p =

reverse

(slow->next)

; slow->next =

null

;/* 2. 看反轉鍊錶是否正確

while(head) coutnext;

cout << endl;

while(p) cout << p->val <<' ', p = p->next;

*/// 3.合併鍊錶

merge

(head,p);}

listnode*

reverse

(listnode* head)

return pre;

}void

merge

(listnode* l1,listnode* l2)}}

;

/**

* struct treenode ;

*/class solution

bool dfs

(treenode* root,

int sum)

};

去重技巧

class solution 

void

dfs(vector<

int>

& num,

int u)

for(

int i =

0;i < num.

size()

;i ++)}

}};

演算法題 牛客研發最愛考 31 40

用堆進行多路歸併,時間複雜度o n logk o nlogk o nlog k definition for singly linked list.struct listnode class solution listnode head new listnode 1 auto cur head wh...

牛客網華為研發工程師程式設計題2 3

程式設計題 明明的隨機數 時間限制 c c 1秒,其他語言2秒 空間限制 c c 32m,其他語言64m 明明想在學校中請一些同學一起做一項問卷調查,為了實驗的客觀性,他先用計算機生成了n個1到1000之間的隨機整數 n 1000 對於其中重複的數字,只保留乙個,把其餘相同的數去掉,不同的數對應著不...

牛客演算法刷題注意事項

方式1 import sys lines sys.stdin.readlines 方式2 while true line input if line breaka 1 2 b map int,a print b ret int 0100 2 二維陣列轉置a 1,2,3 4,5,6 at list m...