算法

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

????????????//??圖:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容