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的字...