1.? 10個(gè)糖果 3個(gè)人分 每個(gè)人至少有一個(gè)糖果 有多少種分法? (邏輯 組合數(shù)列的問題)
?//使用代碼實(shí)現(xiàn):
? ? ? ? ? ? // 一個(gè)人 一個(gè)人 一個(gè)人
? ? ? ? ? ? // 1? ? ? ? 1? ? ? 8
? ? ? ? ? ? // 1? ? ? ? 2? ? ? 7
? ? ? ? ? ? //? ? ? ? 。。。? ?
? ? ? ? ? ? // 1? ? ? ? 8? ? ? 1? ? ? 共有 8種分法
? ? ? ? ? ? // 2? ? ? ? 1? ? ? 7
? ? ? ? ? ? // 2? ? ? ? 2? ? ? 6
? ? ? ? ? ? //? ? ? ? 。。。? ?
? ? ? ? ? ? // 2? ? ? ? 7? ? ? 1? ? ? 共有 7種分法
? ? ? ? ? ? // 3? ? ? 。。。? ? ? ? ? 共有 6種分法
? ? ? ? ? ? // 4? ? ? 。。。? ? ? ? ? 共有 5種分法
? ? ? ? ? ? // 5? ? ? 。。。? ? ? ? ? 共有 4種分法
? ? ? ? ? ? // 6? ? ? 。。。? ? ? ? ? 共有 3種分法
? ? ? ? ? ? // 7? ? ? 。。。? ? ? ? ? 共有 2種分法
? ? ? ? ? ? // 8? ? ? 。。。? ? ? ? ? 共有 1種分法
? ? ? ? ? ? // 總共 有? 8+7+。。。+1 =? 36種
? ? ? ? ? ? ?// var sum = 0;
? ? ? ? ? ? // for (let i = 1; i <= 11; i++) {//一個(gè)for循環(huán)代表一個(gè)位置? 一層
? ? ? ? ? ? //? ? for (let j = 1; j <= 11; j++) {//一個(gè)for循環(huán)代表一個(gè)位置? 一層
? ? ? ? ? ? //? ? ? ? for (let k = 1; k <= 11; k++) {//一個(gè)for循環(huán)代表一個(gè)位置? 一層? ? 可以省略第三層
? ? ? ? ? ? //? ? ? ? ? ? if ((i+j+k)==10) {
? ? ? ? ? ? //? ? ? ? ? ? ? ? sum++
? ? ? ? ? ? //? ? ? ? ? ? }? ? ? ? ? ?
? ? ? ? ? ? //? ? ? ? }? ? ? ? ? ? ? ? ?
? ? ? ? ? ? //? ? }? ? ? ? ? ? ?
? ? ? ? ? ? // }
? ? ? ? ? ? // console.log(sum)//不是最優(yōu)的? 10*10*10?
? ? ? ? ? ? ?//優(yōu)化
? ? ? ? ? ? // var sum = 0;
? ? ? ? ? ? // for (let i = 1; i <= 11; i++) {//一個(gè)for循環(huán)代表一個(gè)位置? 一層
? ? ? ? ? ? //? ? for (let j = 1; j <= 9; j++) {//一個(gè)for循環(huán)代表一個(gè)位置? 一層
? ? ? ? ? ? //? ? ? ? for (let k = 1; k <= 8; k++) {//一個(gè)for循環(huán)代表一個(gè)位置? 一層? ? 可以省略第三層
? ? ? ? ? ? //? ? ? ? ? ? if ((i+j+k)==10) {
? ? ? ? ? ? //? ? ? ? ? ? ? ? sum++
? ? ? ? ? ? //? ? ? ? ? ? }? ? ? ? ? ?
? ? ? ? ? ? //? ? ? ? }? ? ? ? ? ? ? ? ?
? ? ? ? ? ? //? ? }? ? ? ? ? ? ?
? ? ? ? ? ? // }
? ? ? ? ? ? // console.log(sum)//不是最優(yōu)的? 10*9*8?
2.?百錢買百雞 公雞5文錢一只 母雞3文錢一只 一文錢3只小雞 有多少種買法?每種雞至少需要買一種
? ? ? ? ? ? // console.time("fn")
? ? ? ? ? ? // var sum = 0;
? ? ? ? ? ? // for (let i = 0; i <= 100; i++) {//一個(gè)for循環(huán)代表公雞? 一層
? ? ? ? ? ? //? ? for (let j = 0; j <= 100; j++) {//一個(gè)for循環(huán)代表一母雞? 一層
? ? ? ? ? ? //? ? ? ? for (let k = 0; k <= 100; k++) {//一個(gè)for循環(huán)代表小雞? 一層
? ? ? ? ? ? //? ? ? ? ? ? if ((i+j+k)==100 && (i*5+3*j+k/3)==100) {//條件的問題
? ? ? ? ? ? //? ? ? ? ? ? ? ? console.log(i+"--"+j+"--"+k)
? ? ? ? ? ? //? ? ? ? ? ? ? ? sum++
? ? ? ? ? ? //? ? ? ? ? ? }? ? ? ? ? ?
? ? ? ? ? ? //? ? ? ? }? ? ? ? ? ? ? ? ?
? ? ? ? ? ? //? ? }? ? ? ? ? ? ?
? ? ? ? ? ? // }
? ? ? ? ? ? // console.log(sum)//不是最優(yōu)的? 100*100*100? 百萬次循環(huán)? 《==》? 優(yōu)化 660次
? ? ? ? ? ? ?// var sum = 0;
? ? ? ? ? ? // for (let i = 1; i <= 20; i++) {//一個(gè)for循環(huán)代表公雞? 一層
? ? ? ? ? ? ? ? ? ?//for (let j = 1; j <= 33; j++) {//一個(gè)for循環(huán)代表一母雞? 一層
? ? ? ? ? ? ? ? ? ? ?// for (let k = 1; k <= 100; k++) {//一個(gè)for循環(huán)代表小雞? 一層
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? // k=100-i-j;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? if ((i*5+3*j+k/3)==100) {//條件的問題
? ? ? ? ? ? ????????????????????????????????console.log(i+"--"+j+"--"+k)
? ? ? ? ? ? ????????????????????????????????????? ? ? ? ? ? ? ? ?sum++
? ? ? ? ? ? ????????????? ? ? ? ? ?}? ? ? ? ? ?
? ? ? ? ? ???????????? }? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ?}? ? ? ? ? ? ?
? ? ? ? ?}
? ? ? ? ? console.log(sum)//不是最優(yōu)的? 100*100*100? 百萬次循環(huán)? 《==》? 優(yōu)化 660次
3. 如果?a+b+c=1000,且?a^2+b^2=c^2(a,b,c?為自然數(shù)?勾股定理),如何求出所有a、b、c可能的組合??
//?循環(huán)次數(shù)???1000*1000*1000?=??1億次????時(shí)間復(fù)雜度:T(n)?=?O(n*n*n)?=?O(n3)???空間復(fù)雜度
????????//?console.time('serialFn')
????????//?var?count?=?0;
????????//?for?(var?a?=?0;?a?<?1000?;?a++)?{
????????//??for?(var?b?=?0;?b?<?1000?;?b++)?{
????????//??????for?(var?c?=?0;?c?<?1000?;?c++)?{
????????//??????????if?((a+b+c==1000)?&&?(a*a+b*b==c*c))?{
????????//??????????????count++;
????????//??????????????console.log(a+":"+b+":"+c)
????????//??????????}
????????//??????}
????????//??}
????????//?}
????????//?console.log(count)
????????//?console.timeEnd('serialFn')??????????
????????//優(yōu)化??循環(huán)次數(shù)?從?億級(jí)別十萬級(jí)別????時(shí)間復(fù)雜度:T(n)?=?O(n*n*(1+1))?=?O(n*n)?=?O(n2)
????????//?console.time('serialFn')
????????//?var?count?=?0;
????????//?for?(var?a?=?0;?a?<?1000?;?a++)?{
????????//??for?(var?b?=?0;?b?<?1000-a?;?b++)?{
????????//??????????c?=?1000-a-b;
????????//??????????if?((a*a+b*b==c*c))?{
????????//??????????????count++;
????????//??????????????console.log(a+":"+b+":"+c)
????????//??????????}
????????//??}
????????//?}
????????//?console.log(count)
????????//?console.timeEnd('serialFn')??????
????????//實(shí)現(xiàn)算法程序的執(zhí)行時(shí)間可以反應(yīng)出算法的效率,即算法的優(yōu)劣
????????//評(píng)判一個(gè)算法的優(yōu)劣???對(duì)于算法的時(shí)間效率???大O記法??:??時(shí)間復(fù)雜度???空間復(fù)雜度????
????????//算法的優(yōu)劣時(shí)間復(fù)雜度判斷標(biāo)準(zhǔn)???O(1)?<?O(logn)?<?O(n)?<?O(nlogn)?<?O(n2)?<?O(n3)?<?O(2n)?<?O(n!)?<?O(nn)
4. 邏輯題?算法題???有1分??2分??5分的硬幣,求湊1元錢有多少種方法???封裝成函數(shù)???運(yùn)行時(shí)間??get100:?190.869140625ms
????????//?function?get100(){
????????//??console.time('get100')
????????//??let?count?=?0;
????????//??for?(var?a?=?0;?a?<?100?;?a++)?{??//5分
????????//??????for?(var?b?=?0;?b?<?100?;?b++)?{//2分
????????//??????????for?(var?c?=?0;?c?<?100?;?c++)?{//1分
????????//??????????????if?((a*5+b*2+c*1==100))?{
????????//??????????????????count++;
????????//??????????????????console.log(a+":"+b+":"+c)
????????//??????????????}
????????//??????????}
????????//??????}
????????//??}
????????//??console.log(count)??????????
????????//??console.timeEnd('get100')???????
????????//?}
????????//?get100();
????????//?function?get100(){????//時(shí)間復(fù)雜度???o(n*n*n)????20*50*100
????????//??console.time('get100')
????????//??let?count?=?0;
????????//??for?(var?a?=?0;?a?<=?100/5?;?a++)?{??//5分
????????//??????for?(var?b?=?0;?b?<=?100/2?;?b++)?{//2分
????????//??????????for?(var?c?=?0;?c?<=?100/1?;?c++)?{//1分
????????//??????????????if?((a*5+b*2+c*1==100))?{
????????//??????????????????count++;
????????//??????????????????console.log(a+":"+b+":"+c)
????????//??????????????}
????????//??????????}
????????//??????}
????????//??}
????????//??console.log(count)??????????
????????//??console.timeEnd('get100')???????
????????//?}
????????//?get100();
????????//?function?get100(){????//優(yōu)化??時(shí)間復(fù)雜度???o(n*n)????20*50*100????40.68115234375ms
????????//??console.time('get100')
????????//??let?count?=?0;
????????//??for?(var?a?=?0;?a?<=?100/5?;?a++)?{??//5分
????????//??????for?(var?b?=?0;?b?<=?100/2?;?b++)?{//2分
????????//???????????????if?((a*5+b*2<=100?))?{//優(yōu)化???2分與5分的硬幣加起來小于100就行
????????//??????????????????count++;
????????//??????????????????console.log(a+":"+b+":")
????????//??????????????}???
????????//??????}
????????//??}
????????//??console.log(count)??????????
????????//??console.timeEnd('get100')???????
????????//?}
????????//?get100();
????????//?function?get100(){????//優(yōu)化??時(shí)間復(fù)雜度???o(n)???get100:??13.492919921875ms?
????????//??console.time('get100')
????????//??let?count?=?0;
????????//??for?(var?a?=?0;?a?<=?100/5?;?a++)?{??//5分???????
????????//??????????????//?if?((a*5+b*2<=100?))?{//優(yōu)化???2分與5分的硬幣加起來小于等于100就行,只選5分的硬幣的數(shù)量,然后除以2就可以
????????//??????????????????count+=Math.floor((100-a*5)/2);
????????//??????????????????console.log(a+":")
????????//??????????????//?}????
????????//??}
????????//??console.log(count)??????????
????????//??console.timeEnd('get100')???????
????????//?}
????????//?get100();
? ? ? ?數(shù)據(jù)結(jié)構(gòu)只是靜態(tài)的描述了數(shù)據(jù)元素之間的關(guān)系。高效的程序需要在數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ)上設(shè)計(jì)和選擇算法。程? ? ? ? ? ? ? ? ? ? ? ? ?序?=?數(shù)據(jù)結(jié)構(gòu)?+?算法
? ? ? ?總結(jié):算法是為了解決實(shí)際問題而設(shè)計(jì)的,數(shù)據(jù)結(jié)構(gòu)是算法需要處理的問題載體
? ? ? ?數(shù)據(jù)運(yùn)算有五種??插入???刪除??????修改??????查找??????排序
? ? ? ?數(shù)據(jù)結(jié)構(gòu):??順序表、鏈表、棧、隊(duì)列、樹、圖、???面試的時(shí)候?說數(shù)據(jù)結(jié)構(gòu)?一臉蒙??掃盲?
? ? ? ? ?1:?線性表?線性表是某類元素的一個(gè)集合,還記錄著元素之間的一種順序關(guān)系?分成
? ? ? ? ? ? 順序表:????將元素順序地存放在一塊連續(xù)的存儲(chǔ)區(qū)里,元素間的順序關(guān)系由它們的存儲(chǔ)順序自然表示。???連續(xù)的存儲(chǔ)區(qū)?
? ? ? ? ? ?時(shí)間復(fù)雜度為O(1)
? ? ? ? ? ?鏈表:?將元素存放在通過鏈接構(gòu)造起來的一系列存儲(chǔ)塊中。?????通過鏈接(指針)構(gòu)造起來存儲(chǔ)塊
? ? ? ? ? ?單向鏈表?單向循環(huán)鏈表??雙向鏈表??
? ? ? ? ? ???梢杂庙樞虮韺?shí)現(xiàn),也可以用鏈表實(shí)現(xiàn)。
? ? ? ? ? ?隊(duì)列(queue)是只允許在一端進(jìn)行插入操作,而在另一端進(jìn)行刪除操作的線性表。
????????????//??樹(英語:tree)是一種抽象數(shù)據(jù)類型(ADT)或是實(shí)作這種抽象數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu);用來模擬具有樹狀結(jié)構(gòu)性質(zhì)的數(shù)據(jù)集合。它是由n(n>=1)個(gè)有限節(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。
????????????//??????樹中任意節(jié)點(diǎn)的子節(jié)點(diǎn)之間有順序關(guān)系,這種樹稱為有序樹
????????????//??????二叉樹是每個(gè)節(jié)點(diǎn)最多有兩個(gè)子樹的樹結(jié)構(gòu)。通常子樹被稱作“左子樹”(left?subtree)和“右子樹”(right?subtree)
????????????//??????完全二叉樹:對(duì)于一顆二叉樹,假設(shè)其深度為d(d>1)。除了第d層外,其它各層的節(jié)點(diǎn)數(shù)目均已達(dá)最大值,且第d層所有節(jié)點(diǎn)從左向右連續(xù)地緊密排列,這樣的二叉樹被稱為完全二叉樹,其中滿二叉樹的定義是所有葉節(jié)點(diǎn)都在最底層的完全二叉樹;
????????????//??????滿二叉樹:
????????????//??????二叉樹的遍歷:??遞歸??
????????????//??????深度優(yōu)先遍歷???DFS???三種遍歷先序遍歷(preorder??父——》左子樹-》右子樹),中序遍歷(inorder?左子樹——》父節(jié)點(diǎn)-》右子樹)和后序遍歷(postorder??左子樹-》右子樹——》父??)
????????????//??????廣度優(yōu)先遍歷(層次遍歷)??BFS
????????????//??圖: