leetcode math类型题目解题总结
2. Add Two Numbers https://leetcode.com/problems/add-two-numbers/description/
class Solution { public: ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) { ListNode result(-1); ListNode* current = &result; int add = 0; while(l1!=NULL || l2!=NULL){ int val1 = 0; int val2 = 0; if(l1!=NULL){ val1 = l1->val; l1 = l1->next; } if(l2!=NULL){ val2 = l2->val; l2 = l2->next; } current->next = new ListNode((val1+val2+add)%10); add = (val1+val2+add)/10; current = current->next; } if(add == 1) current->next = new ListNode(1); return result.next; } };
7. Reverse Integer https://leetcode.com/problems/reverse-integer/description/
class Solution { public: int reverse(int x) { int res = 0; while(x!=0){ if(res>INT_MAX/10||res<INT_MIN/10){ return 0; } res = res*10 + x%10; x = x/10; } return res; } };
8. String to Integer (atoi) https://leetcode.com/problems/string-to-integer-atoi/description/
class Solution { public: int myAtoi(string str) { long result = 0; int indicator = 1; for(int i = 0; i<str.size();) { i = str.find_first_not_of(' '); if(str[i] == '-' || str[i] == '+') indicator = (str[i++] == '-')? -1 : 1; while('0'<= str[i] && str[i] <= '9') { result = result*10 + (str[i++]-'0'); if(result*indicator >= INT_MAX) return INT_MAX; if(result*indicator <= INT_MIN) return INT_MIN; } return result*indicator; } return 0; } };
学习怎么将代码写得优雅
9. Palindrome Number https://leetcode.com/problems/palindrome-number/description/
class Solution { public: bool isPalindrome(int x) { if(x<0|| (x!=0 &&x%10==0)) return false; int sum=0; while(x>sum) { sum = sum*10+x%10; x = x/10; } return (x==sum)||(x==sum/10); } };
bool isPalindrome(int x) { if(x<0) return false; int y = x,z=0; while(y){ z*=10; z+=(y%10); y=y/10; } if(x==z) return true; return false; }
优化方法、倒置整个数或是只倒置一半
12. Integer to Roman https://leetcode.com/problems/integer-to-roman/description/
class Solution { public: string intToRoman(int num) { string M[] = {"", "M", "MM", "MMM"}; string C[] = {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}; string X[] = {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}; string I[] = {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}; return M[num/1000] + C[(num%1000)/100] + X[(num%100)/10] + I[num%10]; } };
13. Roman to Integer https://leetcode.com/problems/roman-to-integer/description/
class Solution { public: int romanToInt(string s) { map<char,int> m = {{'I',1},{'V',5},{'X',10},{'L',50},{'C',100},{'D',500},{'M',1000}}; int result = 0; int i=0; for(;i<s.size()-1;i++){ if(m[s[i]]<m[s[i+1]]){ result = result + m[s[i+1]] - m[s[i]]; i = i+1; }else{ result = result + m[s[i]]; } } if(i == s.size()-1) result = result+m[s[i]]; return result; } };
29. Divide Two Integers https://leetcode.com/problems/divide-two-integers/description/
class Solution { public: int divide(int dividend, int divisor) { long long m = abs((long long)dividend), n = abs((long long)divisor), res = 0; int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1; while (m >= n) { long long t = n, p = 1; while (m >= (t << 1)) { p <<= 1; t <<= 1; } res += p; m -= t; } if (res == (long long)INT_MAX+1 && sign==1) return INT_MAX; return sign > 0 ? res : -res; } };
如果是INT_MIN除以-1,则会溢出,必须返回INT_MAX
学习一下代码的简洁写法
43. Multiply Strings https://leetcode.com/problems/multiply-strings/description/
class Solution { public: string mul(string s, char c) { int add = 0; for (int i = s.size() - 1; i >= 0; i--) { int r = ((s[i] - '0')*(c - '0') + add) % 10; add = ((s[i] - '0')*(c - '0') + add) / 10; s[i] = r + '0'; } if (add != 0) s.insert(s.begin(), add + '0'); return s; } string add(string num1, string num2) { string result = ""; int pos1 = num1.size() - 1; int pos2 = num2.size() - 1; int add = 0; while (pos1 >= 0 || pos2 >= 0) { int n1 = 0; int n2 = 0; if (pos1 >= 0) { n1 = num1[pos1--]-'0'; } if (pos2 >= 0) { n2 = num2[pos2--]-'0'; } int r = (n1 + n2 + add) % 10; add = (n1 + n2 + add) / 10; result.insert(result.begin(),r+'0'); } if(add!=0) result.insert(result.begin(), add + '0'); return result; } string multiply(string num1, string num2) { string result = ""; for (int i = 0; i < num2.size(); i++) { result = add(result,mul(num1, num2[i])); result.insert(result.end(), '0'); } result.erase(result.end()-1); int pos = 0; while(pos<result.size()&&result[pos]=='0'){ pos++; } result.erase(result.begin(),result.begin()+pos); if(result == "") return "0"; return result; } };
50. Pow(x, n) https://leetcode.com/problems/powx-n/description/
class Solution { public: double myPow(double x, int n) { if(n==0) return 1; if(n==1) return x; if(n==-1) return 1.0/x; double tmp = myPow(x, n/2); if(n%2==0) { return tmp*tmp; } if(n>0) { return tmp*tmp*x; } return tmp*tmp/x; } };
60. Permutation Sequence https://leetcode.com/problems/permutation-sequence/description/
class Solution { public: int getn(int n) { int result = 1; for (int i = 1; i <= n; ++i) result = result * i; return result; } string getPermutation(int n, int k) { --k; map<int, int> m = { {1,1},{2,1},{3,1},{4,1},{5,1},{6,1},{7,1},{8,1},{9,1} }; string result = ""; for (int i = 1; i <= n; ++i) { int pos; //除的方式到最后两项就不成立了,当剩余两项的时候,直接赋值 if (n - i > 1) pos = k / (getn(n - i)) + 1; else if (n - i == 1) pos = k + 1; else if (n - i == 0) pos = 1; int j = 0; //寻找第pos个数,如果遇到map中第二个数为0,则表示该数已经被用过了 for (; j < pos; ++j) { if (m[j+1] == 0) ++pos; } result += to_string(j); m[j] = 0; if(n - i > 1) k = k % getn(n - i); } return result; } };
66. Plus One https://leetcode.com/problems/plus-one/description/
class Solution { public: vector<int> plusOne(vector<int>& digits) { int i=digits.size()-1; for(;i>=0;i--){ if(digits[i] == 9){ digits[i] = 0; }else{ digits[i] = digits[i]+1; break; } } if(i == -1) digits.insert(digits.begin(),1); return digits; } };
67. Add Binary https://leetcode.com/problems/add-binary/description/
class Solution { public: string addBinary(string a, string b) { string ret = ""; int carry = 0; for (int i = a.size() - 1, j = b.size() - 1; i >= 0 || j >= 0; i--, j--) { int m = (i >= 0 && a[i] == '1'); int n = (j >= 0 && b[j] == '1'); ret = to_string((m + n + carry) & 0x1) + ret; carry = (m + n + carry) >> 1; } return carry ? '1' + ret : ret; } };
69. Sqrt(x) https://leetcode.com/problems/sqrtx/description/
class Solution { public: int mySqrt(int x) { long long pos1 = 0; long long pos2 = x; long long result = x; while(pos1<pos2){ long long middle = (pos1+pos2)/2+1; if(middle*middle == result) return middle; else if(middle*middle < result){ pos1 = middle; }else{ pos2 = middle-1; } } return pos1; } };
166. Fraction to Recurring Decimal https://leetcode.com/problems/fraction-to-recurring-decimal/description/
class Solution { public: string fractionToDecimal(int numerator, int denominator) { if (!numerator) return "0"; string res; if (numerator < 0 ^ denominator < 0) res += '-'; long numer = numerator < 0 ? (long)numerator * (-1) : (long)numerator; long denom = denominator < 0 ? (long)denominator * (-1) : (long)denominator; long integral = numer / denom; res += to_string(integral); long rmd = numer % denom; if (!rmd) return res; res += '.'; rmd *= 10; unordered_map<long, long> mp; while (rmd) { long quotient = rmd / denom; if (mp.find(rmd) != mp.end()) { res.insert(mp[rmd], 1, '('); res += ')'; break; } mp[rmd] = res.size(); res += to_string(quotient); rmd = (rmd % denom) * 10; } return res; } };
168. Excel Sheet Column Title https://leetcode.com/problems/excel-sheet-column-title/description/
class Solution { public: string convertToTitle(int n) { string res; char tmp; while (n) { n -= 1; tmp = 'A' + n % 26; res = tmp + res; n /= 26; } return res; } };
171. Excel Sheet Column Number https://leetcode.com/problems/excel-sheet-column-number/description/
class Solution { public: int titleToNumber(string s) { int result = 0; int times = 0; for (int i = s.size() - 1; i >= 0; i--) { result = result + (s[i] - 'A' + 1)*pow(26, times++); } return result; } };
172. Factorial Trailing Zeroes https://leetcode.com/problems/factorial-trailing-zeroes/description/
class Solution { public: int trailingZeroes(int n) { int result = 0; for (long long t = 5; t <= n; t= t*5) { result += n / t; } return result; } };
204. Count Primes https://leetcode.com/problems/count-primes/description/
class Solution { public: int countPrimes(int n) { bool* isPrime = new bool[n]; for(int i = 2; i < n; i++){ isPrime[i] = true; } for(int i = 2; i*i < n; i++){ if (!isPrime[i]) continue; for(int j = i * i; j < n; j += i){ isPrime[j] = false; } } int count = 0; for (int i = 2; i < n; i++) { if (isPrime[i]) count++; } return count; } };
223. Rectangle Area https://leetcode.com/problems/rectangle-area/description/
class Solution { public: int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) { int area1 = abs(D-B)*abs(C-A); int area2 = abs(H-F)*abs(G-E); if(C<E || A>G || H<B || F>D) return area1+area2; int lengthright = min(C,G); int lengthleft = max(A,E); int hightop = min(D,H); int highbuttom = max(F,B); int area3 = abs(lengthright-lengthleft)*abs(hightop-highbuttom); return area1+area2-area3; } };
231. Power of Two https://leetcode.com/problems/power-of-two/description/
class Solution { public: bool isPowerOfTwo(int n) { return n > 0 && !(n & (n - 1)); } };
258. Add Digits https://leetcode.com/problems/add-digits/description/
class Solution { public: int addDigits(int num) { while(num>=10){ int result = 0; while(num>0){ result = result + num%10; num = num/10; } num = result; } return num; } };
263. Ugly Number https://leetcode.com/problems/ugly-number/description/
class Solution { public: bool isUgly(int num) { if(num == 0) return false; while(num!=1){ bool div = false; if(num%2==0){ num = num/2; div = true; } if(num%3==0){ num = num/3; div = true; } if(num%5==0){ num = num/5; div = true; } if(div==false) return false; } return true; } };
264. Ugly Number II https://leetcode.com/problems/ugly-number-ii/description/
class Solution { public: int nthUglyNumber(int n) { if (n<=0) return -1; vector<int> q(n); int t2(0),t3(0),t5(0); q[0]=1; for (int i=1;i<n;++i){ q[i]=min(q[t2]*2,min(q[t3]*3,q[t5]*5)); if (q[i]==q[t2]*2) ++t2; if (q[i]==q[t3]*3) ++t3; if (q[i]==q[t5]*5) ++t5; } return q[n-1]; } };
思路记住,维护3个pos,分别表示乘以3个质数后大于当前最大uglynumber的最小数,之后需要更新pos
279. Perfect Squares https://leetcode.com/problems/perfect-squares/description/
两种动态规划的思路
class Solution { public: int numSquares(int n) { vector<int> dp(1, 0); while (dp.size() <= n) { int m = dp.size(), val = INT_MAX; for (int i = 1; i * i <= m; ++i) { val = min(val, dp[m - i * i] + 1); } dp.push_back(val); } return dp.back(); } };
class Solution { public: int numSquares(int n) { vector<int> dp(n + 1, INT_MAX); dp[0] = 0; for (int i = 0; i <= n; ++i) { for (int j = 1; i + j * j <= n; ++j) { dp[i + j * j] = min(dp[i + j * j], dp[i] + 1); } } return dp.back(); } };
313. Super Ugly Number https://leetcode.com/problems/super-ugly-number/description/
class Solution { public: int nthSuperUglyNumber(int n, vector<int>& primes) { vector<int> index(primes.size(), 0); vector<int> v = { 1 }; for (int i = 0; i<n-1; i++) { int mi = INT_MAX; for (int i = 0; i<primes.size(); i++) { mi = min(mi, primes[i] * v[index[i]]); } v.push_back(mi); for (int i = 0; i<primes.size(); i++) { while (primes[i] * v[index[i]]<=mi) index[i]++; } } return v.back(); } };
319. Bulb Switcher https://leetcode.com/problems/bulb-switcher/description/
class Solution { public: int bulbSwitch(int n) { return sqrt(n); } };
326. Power of Three https://leetcode.com/problems/power-of-three/description/
class Solution { public: bool isPowerOfThree(int n) { if(n==0) return false; while(n%3==0){ n = n/3; } if(n==1) return true; else return false; } };
343. Integer Break https://leetcode.com/problems/integer-break/description/
class Solution { public: int integerBreak(int n) { int result = 1; if (n <= 4) return n == 4? 4: n-1; while (n > 4) { result *= 3; n -= 3; } return result * n; } };
357. Count Numbers with Unique Digits https://leetcode.com/problems/count-numbers-with-unique-digits/description/
class Solution { public: int permutation(int n, int r) { if(r == 0) { return 1; }else{ return n * permutation(n - 1, r - 1); } } int countNumbersWithUniqueDigits(int n) { int sum = 1; if(n > 0) { int end = (n > 10)? 10 : n; for(int i = 0; i < end; i++) { sum += 9 * permutation(9, i); } } return sum; } };
365. Water and Jug Problem https://leetcode.com/problems/water-and-jug-problem/description/
class Solution { public: bool canMeasureWater(int x, int y, int z) { return z == 0 || (x + y >= z && z % gcd(x, y) == 0); } int gcd(int x, int y) { return y == 0 ? x : gcd(y, x % y); } };
367. Valid Perfect Square https://leetcode.com/problems/valid-perfect-square/description/
class Solution { public: bool isPerfectSquare(int num) { if(int(sqrt(num))*int(sqrt(num)) == num) return true; else return false; } };
368. Largest Divisible Subset https://leetcode.com/problems/largest-divisible-subset/description/
class Solution { public: vector<int> largestDivisibleSubset(vector<int>& nums) { if(nums.size()==0) return vector<int>(); sort(nums.begin(), nums.end()); vector<int> v(nums.size(),1); vector<int> path(nums.size(), 0); int maxnum = 1; int maxpos = 0; for (int i = 1; i < nums.size(); i++) { for (int j = 0; j < i; j++) { if (nums[i] % nums[j] == 0 && v[i] < v[j] + 1) { v[i] = v[j] + 1; path[i] = j; if (v[i] > maxnum) { maxnum = v[i]; maxpos = i; } } } } vector<int> result; for (int i = 0; i < maxnum; i++) { result.push_back(nums[maxpos]); maxpos = path[maxpos]; } return result; } };
动态规划,n的子集的个数用v[n]表示,等于之前能被整除的最大数代表的子集+1,每次i渠道一个新值,就在前面寻找所有能被该数整除的数j,v[j]表示该数的子集数
还用到了path来保存路径
372. Super Pow https://leetcode.com/problems/super-pow/description/
class Solution { const int base = 1337; int powmod(int a, int k) //a^k mod 1337 where 0 <= k <= 10 { a %= base; int result = 1; for (int i = 0; i < k; ++i) result = (result * a) % base; return result; } public: int superPow(int a, vector<int>& b) { if (b.empty()) return 1; int last_digit = b.back(); b.pop_back(); return powmod(superPow(a, b), 10) * powmod(a, last_digit) % base; } };
8
9
29
50
60
66
69
204
231
264
279
313
319
357
368