classSolution{public:intnodeCount(TreeNode *root){if(root ==nullptr)return0;returnnodeCount(root->left)+nodeCount(root->right)+1;}booljudge(TreeNode *root,int n ,int m){if(root ==nullptr)return n ==0;if(n ==0)returnfalse;if(n ==1)return root->left ==nullptr&& root->right ==nullptr;int k =max(0,2* m -1);int l =min(m, n - k), r = n - k - l;returnjudge(root->left,(k -1)/2+ l, m /2)&&judge(root->right,(k -1)/2+ r, m /2);}boolisCompleteTree(TreeNode* root){if(root ==nullptr)returntrue;int n =nodeCount(root), m =1, cnt =1;while(cnt +2* m <= n){
m *=2;
cnt += m;}returnjudge(root, n, m);}};
464. 我能赢吗
classSolution{public:
unordered_map<int,bool> h;booldfs(int mask,int n,int total){if(h.find(mask)!= h.end())return h[mask];for(int i =1; i <= n; i++){if(mask &(1<< i))continue;if(i >= total ||!dfs(mask |(1<< i), n, total - i)){return h[mask]=true;}}return h[mask]=false;}boolcanIWin(int maxChoosableInteger,int desiredTotal){int n = maxChoosableInteger, mask =0;if((1+ n)* n /2< desiredTotal)returnfalse;
h.clear();returndfs(mask, maxChoosableInteger, desiredTotal);}};
172. 阶乘后的零
classSolution{public:inttrailingZeroes(int n){int m =5, cnt =0;while(n / m){
cnt += n / m;
m *=5;}return cnt;}};
384. 打乱数组
classSolution{public:
vector<int> nums;Solution(vector<int>& nums):nums(nums){srand(time(0));}
vector<int>reset(){return nums;}
vector<int>shuffle(){
vector<int>ret(nums);for(int i =0; i < ret.size(); i++){swap(ret[i], ret[rand()% ret.size()]);}return ret;}};
437. 路径总和 III
classSolution{public:
unordered_map<long,long> h;longcount(TreeNode *root,long sum,long targetSum){if(root ==nullptr)return0;
sum += root->val;int ans = h[sum - targetSum];
h[sum]+=1;
ans +=count(root->left, sum, targetSum);
ans +=count(root->right, sum, targetSum);
h[sum]-=1;return ans;}longpathSum(TreeNode* root,int targetSum){
h.clear();
h[0]=1;returncount(root,0, targetSum);}};
395. 至少有 K 个重复字符的最长子串
classSolution{public:intlongestSubstring(string s,int k){
unordered_map<char,int> cnt;
vector<int> splits;for(auto x: s) cnt[x]+=1;for(int i =0; s[i];++i){if(cnt[s[i]]< k) splits.push_back(i);}
splits.push_back(s.size());if(splits.size()==1)return s.size();int pre =0, ans =0;for(auto p : splits){int len = p - pre;if(len >= k){
ans =max(ans,longestSubstring(s.substr(pre, len), k));}
pre = p +1;}return ans;}};
190. 颠倒二进制位
classSolution{public:uint32_treverseBits(uint32_t n){uint32_t ret =0;for(uint32_t i =0, j =1, k =(1<<31); i <32; i++, j <<=1, k >>=1){if(n & j) ret |= k;}return ret;}};
8. 字符串转换整数 (atoi)
classSolution{public:intmyAtoi(string s){int flag =1, max_pre = INT_MAX /10, d = INT_MAX %10, ind =0, num =0;while(s[ind]==' ')++ind;if(s[ind]=='-') flag =-1, ind +=1;elseif(s[ind]=='+') ind +=1;for(; s[ind];++ind){if(s[ind]<'0'|| s[ind]>'9')break;if(num > max_pre ||(num == max_pre && s[ind]-'0'> d)){if(flag >0)return INT_MAX;return INT_MIN;}
num = num *10+(s[ind]-'0');}return num * flag;}};