1、leetcode第46題:全排列
給定乙個沒有重複數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3]
輸出:[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
(1)思路
核心思想是在乙個排列的基礎上,1,2,3,按照規律交換位置,得到新的排列。比如1和2交換:2,1,3。1和3交換:3,2,1
(2)**
class solution {
// 返回資料,此處定義成全域性,為了保證在遞迴過程中始終可以被使用
list> result = new linkedlist();
// 交換鍊錶中兩個位置的資料
void swapvalue(arraylistlist, int former, int later){
int tem = list.get(former);
list.set(former,list.get(later));
list.set(later,tem);
// 回溯方法
void backtrack(int now, arraylistlist, int nums){
if(now == nums.length){
result.add(new arraylist(list));
return;
// 此for迴圈從0開始到nums.length,表示逐個的與第0個元素進行交換
// 比如,1,2,3,4,for迴圈完成的是2,1,3,4;3,2,1,4;4,2,3,1。也即2,3,4逐個與1交換位置
for(int i = now; i < nums.length; i++){
swapvalue(list, now, i);
// 進行後續位置的交換
backtrack(now+1,list,nums);
swapvalue(list, now, i);
public list> permute(int nums) {
arraylistlist = new arraylist<>();
for(integer fac : nums){
list.add(fac);
backtrack(0, list, nums);
return result;
2、leetcode第77題:組合
給定兩個整數 n 和 k,返回 1 ... n 中所有可能的 k 個數的組合。
示例:輸入: n = 4, k = 2
輸出:[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]**:
class solution {
list> result = new arraylist();
void backtrack(int start, int n, int k, arraylistlist){
if(list.size() == k){
result.add(new arraylist(list));
return;
for(int i = start; i <= n; i++){
list.add(i);
backtrack(i+1,n,k,list);
list.remove(list.size()-1);
public list> combine(int n, int k) {
backtrack(1,n,k,new arraylist());
return result;
思路為王,一定先把演算法思路、過程細節想清楚,想明白,然後**就水到渠成。
每日一演算法1
插入排序 首先來解釋一下插入排序法的原理 它的原理是每插入乙個數都要將它和之前的已經完成排序的序列進行重新排序,也就是要找到新插入的數對應原序列中的位置。那麼也就是說,每次插入乙個數都要對原來排序好的那部分序列進行重新的排序,時間複雜度同樣為o n 這種演算法是穩定的排序方法。下面我用乙個圖來解釋一...
每日演算法 1 複雜度
1.什麼是演算法 alorithm 數學領域裡 演算法是用於解決某一類問題的公式和思想 計算機領域裡 它的本質是一系列程式指令,用於解決特定的運算和邏輯問題 2.演算法有高效的,也有拙劣的 衡量演算法好壞的重要標準有兩個 時間複雜度和空間複雜度 演算法的應用領域 1 數 算還不簡單?其實不然比如求兩...
每日練習1
1.internet中地理網域名稱中國的縮寫是 b 2.設立資料鏈路層的主要畝的是將一條原始的 有差錯的物理線路變為對網路層無差錯的 b 3.如果借用 c 類 ip 位址中的 4 位主機號劃分子網,那麼子網掩碼應該為 4.使用者資料報 udp 的首部欄位有 16 個位元組,這種說法正確嗎?解析 ud...