OJ 分治與遞迴

2021-09-26 13:27:33 字數 3868 閱讀 2568

//非遞迴解法

class solution

if (input[mid] == target)

else if (input[mid] < target)

else if (input[mid] > target)

}return left;

}};

(1)外面是left和right;

(2)  while迴圈l<=r;

(3) 迴圈裡:先mid, 找到時,未找到的兩種情況

//遞迴寫法 只過了輸入樣例

#include"pch.h"

#include#includeusing namespace std;

int binarysearchrecursion(vectornums, int target, int left, int right)

}int main()

//test;

//bs

cout<(未完待續。。。)

//非leetcode是用stl list版

#include#include#includeusing namespace std;

//兩個鍊錶的融合

listmergetwolist(listlist1, listlist2)

else

} if (!list1.empty())

else

return total;

}//分治

listmergeklist(vector>input)

int main()

input.push_back(tmplist);

} //test

//dc 注意鍊錶的遍歷

listresult=mergeklist(input);

list::iterator it= result.begin();

while (it != result.end())

cout << endl;

} return 0;

}

(1)普通兩個有序鍊錶的合併:兩個都非空時乙個大的解決,兩個有乙個為空時直接賦。

(2)分治,就是大的解決不了,小的我會,從小往大解決。

(3)積累list的用法。注意不能使用下標。使用iterator訪問。

//leetcode ac 版本  這個不是重點,看看下面自己在vs上手動輸入測試的

/** * definition for singly-linked list.

* struct listnode

* };

*/class solution

else

}tail->next = tmp1!=nullptr ? tmp1 : tmp2;

return resulthead->next;

}

listnode* mergeklists(vector& store)

};

#include#includeusing namespace std;

//節點

struct listnode

};//合併兩個鍊錶

listnode* mergetwolist(listnode* list1,listnode*list2)

else

}tail->next = tmp1!=nullptr ? tmp1 : tmp2;

return resulthead->next;

}//合併k個鍊錶

listnode* mergeklist(vectorstore)

int main()

//建立多鍊錶

vectorstore;

for (int i = 0; i < len.size(); i++)

store.push_back(head->next);

}

//呼叫分治函式

listnode*result=mergeklist(store);

//output

listnode* it = result;

while (it!=nullptr)

} return 0;

}

(1)vs陣列越界的技巧一定要積累。

(2)斷點除錯

class solution 

while (input[i] >= flag && i < j)

if (i < j)

} //move the flag

input[left] = input[i];

input[i] = flag;

quicksort(input, left, i - 1);

quicksort(input, i + 1, right);

return;

}

int findkthlargest(vector& nums, int k)

};

(1)為什麼一開始 i>=j 返回: 這代表上一層函式的長度為0 or 1 , 意味著遞迴可以結束了。

(3)為什麼裡面的while用《而不是<=: 因為=有可能讓i大於j這樣就永遠也跳不出迴圈了。

(4)為什麼最後交換的時候 i和= 也沒意義呀。            

//記憶體換時間 最後通過寫法

class solution

return store[n];

}};

//超時

class solution

};

(1)fibonacci的遞迴模板:(或者tribonacci)下面不滿足遞迴的直接return,上面return 遞迴

(2)遞迴轉換為陣列的方法:情況數就是陣列的大小,遞迴返回點的先存起來,用以計算後面的。

// leetcode ac ** 分治法

class solution

return cntx>cnty?x:y;

}};

(1)分開的要領,如:vector。  從遞迴的出口導結果。

(2)治。就需要具體問題具體對待。

double distance(int x, int y) 

void quicksort(vector>&input,int left,int right)

};

(1)相較以前版本,對於交換部分的優化

(2)槓桿忘記

class solution 

vectorres1 = beautifularray((num + 1) / 2);

for (int i = 0; i < res1.size(); i++)

vectorres2 = beautifularray(num / 2);

for (int i = 0; i < res2.size(); i++)

return res;

}};

(1)關於分治:有乙個向下分散的過程,還有乙個向上返回的過程。

(2)關於糾錯:多花幾秒鐘寫個清楚的列印,能更好地幫助你尋找錯誤。(列印好像比跟程式快)

class solution 

case '-':

case '*': }}

}} }

if (result.empty())

return result;

}};

(1)遞迴其實是樹形結構的一種表示

(2)將遞迴和迴圈結合可以做排列組合

分治與遞迴

分治與遞迴 分治法的設計思想是,將乙個難以直接解決的大問題,分割成一些規模較小的相同問題,以便各個擊破,分而治之。對這k個子問題分別求解。如果子問題的規模仍然不夠小,則再劃分為k個子問題,如此遞迴的進行下去,直到問題規模足夠小,很容易求出其解為止。將求出的小規模的問題的解合併為乙個更大規模的問題的解...

遞迴與分治

一 1 求階乘 int factorial int n 2 fibonacci函式 int fibonacci int n 3 全排列 1 字串的全排列 主函式見 2 int permutation char a,int k,int m permutation arr,0,n 1 return 0 ...

遞迴與分治

fibonacci數列 無窮數列1,1,2,3,5,8,13,21,34,55,稱為fibonacci數列。它可以遞迴地定義為 第n個fibonacci數可遞迴地計算如下 int fibonacci int n 編寫完整的主函式,分別記錄利用上述遞迴函式求第47,48,49,50,51,52個fib...