2021 2 1 演算法練習

2022-06-06 23:42:16 字數 4430 閱讀 9541

888. 公平的糖果棒交換

本題暴力解題會超時。

設愛麗絲擁有的糖果總大小為suma,鮑勃擁有的糖果總大小為sumb,設愛麗絲用於交換的糖果為a[i],鮑勃用於交換的糖果為b[j]

那麼交換後,兩人糖果總大小相同可以表示成:suma - a[i] + b[j] = sumb - b[j] + a[i]

所以:​ a[i] = (suma - sumb) / 2 + b[j]

​ b[j] = a[i] - (suma - sumb) / 2

推出這兩個式子後

由於1 <= a[i],b[j] <= 100000

因此對這個範圍的數字進行一次遍歷,如果對應的糖果大小存在與a,b中,就直接返回結果。

class solution 

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

}// suma - a[i] + b[j] = sumb - b[j] + a[i]

// suma - sumb = 2*(a[i] - b[j])

// target = suma - sumb

// a[i] - target / 2 = b[j]

// target / 2 + b[j] = a[i]

int target = suma - sumb ;

for (int i = 1; i <= 100000;i++) ;

}if (mapb.find(i) != mapb.end() && mapa.find(i + target / 2) != mapa.end()) ;}}

return ;

}};

劍指 offer 36. 二叉搜尋樹與雙向鍊錶

對於二叉搜尋樹而言,中序遍歷一定是乙個遞增序列

因此本題可以使用中序遍歷來構建雙向鍊錶

節點pre表示前乙個節點,cur表示當前節點,最後pre會指向最後乙個節點

/*

// definition for a node.

class node

node(int _val)

node(int _val, node* _left, node* _right)

};*/

class solution

dfs(cur->left) ;

if (pre != nullptr) else

pre = cur ;

dfs(cur->right) ;

}node* treetodoublylist(node* root)

pre = nullptr ;

head = nullptr ;

dfs(root) ;

head->left = pre ;

pre->right = head ;

return head ;

}};

劍指 offer 45. 把陣列排成最小的數

定義排序方式,使用sort進行快速排序即可

bool cmp(int x, int y) 

class solution

return ans ;

}};

劍指 offer 49. 醜數

時間複雜度o(1)的做法,打表~

class solution ;

int nthuglynumber(int n)

};

正常做法是

質因子只包含2,3,5的數字一定是由其他數字乘以2,3,5得來

因此首先設定三個索引,a,b,c

設定陣列dp[i]表示第i個醜數

初始化dp[1] = 1, a,b,c = 1

對於第二個醜數dp[2] = min(dp[a] * 2, dp[b] * 3, dp[c] * 5)

因此第二個醜數dp[2] = 2

同時將a索引加一,令它指向dp[2]

因此類推

注意在判斷對哪個索引加一時要注意,這裡要使用if if if的判斷結構,而不能使用 if else if 的判斷結構,因為可能會出現重複,比如2×3和3×2,結果都等於6,如果使用後者,只會對乙個索引進行加一,那麼另乙個索引就會生成重複的醜數

int nthuglynumber(int n) 

return dp[n - 1];

}

劍指 offer 38. 字串的排列

這題和全排列的思路一樣,不同的是這題的字元會出現重複,因此需要使用乙個set容器,儲存當前遍歷過的字元,在遇到相同的字元時跳過,防止生成重複的排列

class solution 

setst ;

for (int i = pos;i < s.size();i++)

}vectorpermutation(string s)

dfs(0, s) ;

return ans ;

}};

劍指 offer 26. 樹的子結構

本題需要遍歷a樹的每個節點,由於b樹可能是a樹的子結構,所以a樹的每個節點都可能是b樹的根節點,所以對於a樹的每個節點,都需要檢查一次是否是子結構

/**

* definition for a binary tree node.

* struct treenode

* };

*/class solution

bool check(treenode* a, treenode* b)

if (a == null)

if (a->val != b->val)

return check(a->left, b->left) && check(a->right, b->right) ;

}};

劍指 offer 20. 表示數值的字串

檢測該字串是否是乙個數字,比較麻煩,因為有很多形式的數字,比如123.和.33都屬於數字

class solution  

s.erase(0,s.find_first_not_of(" ")); 

s.erase(s.find_last_not_of(" ") + 1); 

}// 檢測s字串是否是乙個數字

// tag為true,表示檢測該字串是否是整數

// tag為false,表示檢測該字串是否是小數

bool check(string s, bool tag) else

}// 如果字串的大小只有1,且唯一的字元是小數點,說明不是乙個數字,返回false

// 或者字串為空,也返回false

if ((s.size() == 1 && ( s[0] == '.' )) || s.size() == 0)

// 查詢是否有小數點

int lpos = s.find(".") ;

int rpos = s.rfind(".") ;

// 如果小數點不相等,說明有多個小數點,直接返回false

if (lpos != rpos) return false ;

if (lpos != -1)

}// 逐個檢查是否有非法字元

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

}return true ;

}bool isnumber(string s)

if (s[0] < '0' || s[0] > '9') else

}if ((s.size() == 1 && ( s[0] == '.' )) || s.size() == 0)

// 檢查是否有e或者e的存在

int pos ;

pos = s.find("e") ;

if (pos == -1)

// 沒有e或者e的存在,直接檢測是否是乙個數字

if (pos == -1)

if (pos == 0 || pos == s.size() - 1)

// 有e或者e的存在,將字串分成兩半,分別檢測

// 在e/e之後的數字必須是乙個整數

string ls = s.substr(0, pos) ;

string rs = s.substr(pos + 1) ;

return check(ls, false) && check(rs, true) ;

}};

53. 最大子序和

動態規劃基本題目

狀態轉移方程:dp[i] = max(dp[i-1]+nums[i], nums[i])

dp[i]表示以nums[i]為結尾,最大的子序和

class solution 

return ans;

}};

2021 2 1學習總結

函式 定義 對實現某一特殊功能的 的封裝 函式的分類 系統函式 python系統建立好的函式,需要函式功能的時候使用 自定義函式 由程式設計師自己建立 定義函式 語法 def 函式名 形參列表 函式說明文件 函式體 說明 def 冒號 固定寫法 函式名 自己定義 識別符號 不是關鍵字 見名知義 形參...

2021 2 1生活日記

今天是2月的第一天,萬物初始,猶欲新生 看見乙個博主,六斗公尺折腰 看到他在csdn上發表的一篇文章,有關於書法的,感悟頗深,我以前也很喜歡書法,尤其愛練毛筆字,可是後面忘了,無數個夜晚也想過,在某寶上買上一副裝備,然後來重操舊業,也不貴,便宜的一套也就20來塊,遲遲被拖延症害了,欸,希望以後有機會...

2021 2 1基於Python實現鍊錶

2021 2 1 2.雜記 參考部落格 1.1節點類class node data 節點儲存的資料 next 儲存下乙個節點物件 def init self,data,pnext none self.data data self.next pnext def repr self 用來定義node的字...