//非遞迴解法
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...