diff --git a/LeetCode-CN/48_旋转图像.md b/LeetCode-CN/48_旋转图像.md new file mode 100644 index 0000000..c24c592 --- /dev/null +++ b/LeetCode-CN/48_旋转图像.md @@ -0,0 +1,159 @@ +## 48. 旋转图像@2018/06/24 + +### jzf +* 4ms +```c++ +class Solution { +public: + void rotate(vector>& matrix) { + + int tmp; + for(size_t i=0; i>& matrix) { + int n = matrix.size(); + if (n % 2) // odd number, easy + { + int mid = n / 2; + + for (int dis = 1; dis <= mid; dis++) + { + // do chain swap at distance:dis + int swap_n = 2 * dis + 1; + // save right col + vector tvec; + int begin_pos = mid - dis; + for (int i = 0; i < swap_n; i++) + { + tvec.push_back(matrix[begin_pos + i][mid + dis]); + } + // start rotate + // RIGHT <- UPPER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid + dis, mid - dis, begin_pos + i); + matrix[begin_pos + i][mid + dis] = matrix[mid - dis][begin_pos + i]; + } + // UPPER <- LEFT + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", mid - dis, begin_pos + i, begin_pos + i, mid - dis); + matrix[mid - dis][begin_pos + (swap_n - i - 1)] = matrix[begin_pos + i][mid - dis]; + } + // LEFT <- DOWNER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid - dis, mid + dis, begin_pos + i); + matrix[begin_pos + i][mid - dis] = matrix[mid + dis][begin_pos + i]; + } + // DOWNER <- TEMP + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-tvec[%d]\n", mid + dis, begin_pos + i, i); + matrix[mid + dis][begin_pos + (swap_n - i - 1)] = tvec[i]; + } + + // debug + //print(matrix); + } + } + else // oh, this stuff sucks. + { + int mid = n / 2 ; + + for (int dis = 1; dis <= mid ; dis++) + { + // do chain swap at distance:dis + int swap_n = 2 * dis; + // save right col + vector tvec; + int begin_pos = mid - dis; + for (int i = 0; i < swap_n; i++) + { + tvec.push_back(matrix[begin_pos + i][mid + dis - 1]); + } + // start rotate + // RIGHT <- UPPER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid + dis, mid - dis, begin_pos + i); + matrix[begin_pos + i][mid + dis - 1] = matrix[mid - dis][begin_pos + i]; + } + // UPPER <- LEFT + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", mid - dis, begin_pos + i, begin_pos + i, mid - dis); + matrix[mid - dis][begin_pos + (swap_n - i - 1)] = matrix[begin_pos + i][mid - dis]; + } + // LEFT <- DOWNER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid - dis, mid + dis, begin_pos + i); + matrix[begin_pos + i][mid - dis] = matrix[mid + dis -1][begin_pos + i]; + } + // DOWNER <- TEMP + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-tvec[%d]\n", mid + dis, begin_pos + i, i); + matrix[mid + dis -1][begin_pos + (swap_n - i - 1)] = tvec[i]; + } + + // debug + //print(matrix); + } + } + } +}; +``` +### puck +class Solution +{ + public: + void rotate(vector> &matrix) + { + auto n = matrix.size(); + auto max = n - 1; + auto half = n / 2; + + for (int i{}; i < half; ++i) + { + for (int j{}; j < half; ++j) + { + std::swap(matrix[i][j], matrix[j][max - i]); + std::swap(matrix[i][j], matrix[max - i][max - j]); + std::swap(matrix[i][j], matrix[max - j][i]); + } + } + + if (n == 2 * half + 1) + { + for (int i{}; i < half; ++i) + { + std::swap(matrix[i][half], matrix[half][max - i]); + std::swap(matrix[i][half], matrix[max - i][half]); + std::swap(matrix[i][half], matrix[half][i]); + } + } + } +}; +``` diff --git a/LeetCode-CN/刷题.md b/LeetCode-CN/刷题.md new file mode 100644 index 0000000..e84299d --- /dev/null +++ b/LeetCode-CN/刷题.md @@ -0,0 +1,2475 @@ +>create by jzf@2018/06/20 + +[TOC] +# 作业 +## 627. 交换工资 @2018/06/20 + +### jzf :517ms +```c++ +update salary + set sex = case when sex ='m' then 'f' else 'm' end; +``` +### kiritow:563ms +```c++ + update salary set sex = case sex + when 'f' then 'm' + when 'm' then 'f' + end +``` + + +## 3. 无重复字符的最长子串 @2018/06/20 + +### 北河 + + * 第一版 :392ms + ```c++ + class Solution { + public: + int lengthOfLongestSubstring(string s) { + map v; + int max_num = 0; + for (int i = 0; i < s.size(); ++i) { + if (v.find(s[i]) != v.end()) { + if (max_num < v.size()) { + max_num = v.size(); + } + i = v.find(s[i])->second + 1; + v.clear(); + } + if (i >= s.size()) { + break; + } + v[s[i]] = i; + if (max_num < v.size()) { + max_num = v.size(); + } + } + return max_num; + } + }; + + ``` + * 第2版 :32ms + ```c++ + class Solution { + public: + int lengthOfLongestSubstring(string s) { + map v; + int max_num = 0; + for (int i = 0; i < s.size(); ++i) { + if (v.find(s[i]) != v.end()) { + if (max_num < v.size()) { + max_num = v.size(); + } + ++i; + while (i < s.size()) { + if (v.find(s[i]) != v.end()) { + ++i; + continue; + } + --i; + break; + } + if (i >= s.size()) { + return max_num; + } + i = v.find(s[i])->second + 1; + v.clear(); + } + if (i >= s.size()) { + break; + } + v[s[i]] = i; + if (max_num < v.size()) { + max_num = v.size(); + } + } + return max_num; + } + }; + ``` +### jzf :252 ms 8 +```c++ +class Solution { +public: + int lengthOfLongestSubstring(string s) { + int num =1; + int max =0; + if(s.length()==1) + { + return 1; + } + for(size_t i =0;imax) + { + max =num; + } + if(flag ==1) + { + break; + } + num =1; + } + num =1; + } + return max; + } +}; +``` +### puck :544ms 2 +```c++ +#ifndef SOLUTION_H +#define SOLUTION_H + +#include +#include +#include +using std::string; +class Solution +{ + public: + int lengthOfLongestSubstring(string s) + { + int result{}; + for (std::size_t i{}; i < s.size(); ++i) + { + string tmp_str = s.substr(i); + int cu_length{}; + std::set set_except; + + for (auto ch : tmp_str) + { + if (set_except.end() == set_except.find(ch)) + { + set_except.insert(ch); + ++cu_length; + } + else + { + break; + } + } + + result = std::max(result, cu_length); + } + + return result; + } +}; + +#endif +``` +### kiritow :24ms 2 +```c++ +#include +#include +class Solution { +public: + int lengthOfLongestSubstring(string s) { + int sz = s.size(); + int bin[256]; + int maxlen = 0; + int clen = 0; + int L = 0; + while (L < sz) + { + memset(bin, 0, sizeof(int) * 256); + int i; + for (i = L; i < sz; i++) + { + if (bin[s[i]]) + { + maxlen = clen > maxlen ? clen : maxlen; + clen = 0; + L++; + break; + } + else + { + bin[s[i]] = 1; + clen++; + } + } + if (i == sz) + { + maxlen = clen > maxlen ? clen : maxlen; + break; + } + } + return maxlen; + } +}; +``` +### 知识点 + + 桶排序 + sync_with_stdio +### 总结 + +1, 对比代码发现,利用现有的数据结构,可以快速出活,而且代码简洁,逻辑清晰。 + +2, STL不好好用,很慢。 + + + +## 494. 目标和 @2018/06/21 + +### jzf + + * 第一版 超时 复杂度 n*2^n + ```c++ + class Solution { + public: int findTargetSumWays(vector& nums, int S) { + int n = 0; + int sum = 0; + int b = 0; + int size =nums.size(); + for (size_t k = 0; k & nums, int S) { + if (S < -1000 || S>1000) return 0; + + int sz = nums.size(); + int msz = sizeof(int) * 2048; + int _bin[2048] = { 0 }; + int _xbin[2048] = { 0 }; + int* p = _bin; + int* q = _xbin; + memset(p, 0, msz); + p[1000] = 1; + + for (int i = 0; i < sz; i++) + { + memset(q, 0, msz); + for (int j = 0; j < 2048; j++) + { + if (p[j]) + { + //printf("p[%d]=%d\n", p[j]); + // now=j-1000; + int L = j - nums[i]; // now-nums[i]+1000 + int R = j + nums[i]; + q[L] += p[j]; + q[R] += p[j]; + //printf("q[%d]=%d\n", L, q[L]); + //printf("q[%d]=%d\n", R, q[R]); + } + } + std::swap(p, q); + } + return p[S + 1000]; + } +}; +``` + +### 知识点 +dfs + +bfs + +剪枝 + +记忆搜索 + +去掉重复 + +没写dp,身败名裂--惠惠语录 + +## 601. 体育馆的人流量@2018/06/21 +### jzf :521ms 抄 +```sql + select s1.* + from stadium as s1, stadium as s2,stadium as s3 + where (((s2.id =s1.id+1) and (s3.id =s1.id+2)) + or((s2.id =s1.id-1) and (s3.id =s1.id+1)) + or((s2.id =s1.id-2) and (s3.id =s1.id-1))) + and + (s1.people>=100 and s2.people>=100 and s3.people >=100) + group by s1.id +``` +### 知识点 +mysql必知必会 16章 自连接 +### 总结 + +1,看了下最快的sql语句,感叹逻辑差不过的东西,差距真大呀 +## 9. 回文数@2018/06/22 +### 羽柔子 372ms +```js +var isPalindrome = function(x) { + return x.toString()===x.toString().split("").reverse().join(""); +}; +``` +* 第二版 :128ms +```c++ +class Solution { + int list[10],len=0,i=0; +public: + bool isPalindrome(int x) { + if(x<0)return false; + len=i=0; + //分解 + while(true){ + if(x>=10){ + list[len++]=x%10; + x/=10; + } + else{ + list[len++]=x; + break; + } + } + + //判断 + --len; + for(i=0;i=len; + } +}; +``` +### jzf +* 第一版 :232ms + ```c++ + class Solution { + public: + bool isPalindrome(int x) { + int mod; + int sh =x; + vector vec; + if(x <0) + { + return false; + } + if(x ==0) + { + return true; + } + + for(size_t i =0;sh>0;i++) + { + vec.push_back(sh%10); + sh = sh/10; + } + vector::iterator i=vec.begin(); + vector::iterator j=vec.end()-1; + for(;i vec; + if(x <0) + { + return false; + } + if(x ==0) + { + return true; + } + if(x%10 ==0) + { + return false; + } + for(size_t i =0;sh>0;i++) + { + vec.push_back(sh%10); + sh = sh/10; + } + vector::iterator i=vec.begin(); + vector::iterator j=vec.end()-1; + for(;i +class Solution { +public: + bool isPalindrome(int x) { + /* + // Converting to string is too slow!! + char buff[64] = { 0 }; + sprintf(buff, "%d", x); + int len = strlen(buff); + int L = 0, R = len - 1; + while (L < R) + { + if (buff[L] != buff[R]) return false; + ++L; + --R; + } + return true; + */ + if (x < 0) return false; + int buff[64] = { 0 }; + int c = 0; + int tx = x; + while (tx > 0) + { + buff[c++] = tx % 10; + tx /= 10; + } + int L = 0, R = c - 1; + while (L < R) + { + if (buff[L] != buff[R]) return false; + ++L; + --R; + } + return true; + } +}; +``` +### puck +```c++ +#include + +class Solution +{ + public: + bool isPalindrome(int x) + { + if (x < 0) + return false; + + std::string tmp = std::to_string(x); + + std::size_t bi_size = tmp.size() / 2; + auto half = tmp.begin() + bi_size; + auto iter = tmp.begin(); + auto riter = tmp.rbegin(); + for (; iter != half; ++iter, ++riter) + { + if (*iter != *riter) + return false; + } + return true; + } +}; +``` +### 总结 +1, +我在想一个问题 +*羽柔子撤回了一条消息* +喵在想一个问题 --羽柔子语录 +## 225. 用队列实现栈@2018/06/22 + +### 羽柔子 0ms +```c++ +class MyStack { + int stack[10],index=0; + +public: + /** Initialize your data structure here. */ + MyStack() { + } + + /** Push element x onto stack. */ + void push(int x) { + stack[index++]=x; + } + + /** Removes the element on top of the stack and returns that element. */ + int pop() { + return stack[--index]; + } + + /** Get the top element. */ + int top() { + return stack[index-1]; + } + + /** Returns whether the stack is empty. */ + bool empty() { + return !index; + } +}; +``` +### kiritow +```c++ +#include +class MyStack { +public: + /** Initialize your data structure here. */ + MyStack() { + + } + + /** Push element x onto stack. */ + void push(int x) { + lst.push_back(x); + } + + /** Removes the element on top of the stack and returns that element. */ + int pop() { + int t = lst.back(); + lst.pop_back(); + return t; + } + + /** Get the top element. */ + int top() { + return lst.back(); + } + + /** Returns whether the stack is empty. */ + bool empty() { + return lst.empty(); + } +private: + std::list lst; +}; +``` +## 28. 实现strStr() @2018/06/23 + +### jzf + +* 第一版 4ms + +```c++ +class Solution { +public: + int strStr(string haystack, string needle) { + string::iterator ihay; + string::iterator inee; + int ni =haystack.size(); + int nn =needle.size(); + int ret = -1; + + if(nn==0) + { + return 0; + } + if(ni= size_a || haystack.at(i + j) != needle.at(j)) + { + flag = false; + break; + } + } + + if (flag) + { + return i; + } + } + } + + return -1; + } +}; +``` +## 823. Binary Trees With Factors@2018/06/23 + +## 196. 删除重复的电子邮箱@2018/06/23 + +### 北河 + +* +```sql +delete from Person where id in (select c.id from (select a.id from Person a join Person b on a.Email = b.Email and a.Id > b.Id) c); +``` +## 48. 旋转图像@2018/06/24 + +### jzf +* 4ms +```c++ +class Solution { +public: + void rotate(vector>& matrix) { + + int tmp; + for(size_t i=0; i>& matrix) { + int n = matrix.size(); + if (n % 2) // odd number, easy + { + int mid = n / 2; + + for (int dis = 1; dis <= mid; dis++) + { + // do chain swap at distance:dis + int swap_n = 2 * dis + 1; + // save right col + vector tvec; + int begin_pos = mid - dis; + for (int i = 0; i < swap_n; i++) + { + tvec.push_back(matrix[begin_pos + i][mid + dis]); + } + // start rotate + // RIGHT <- UPPER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid + dis, mid - dis, begin_pos + i); + matrix[begin_pos + i][mid + dis] = matrix[mid - dis][begin_pos + i]; + } + // UPPER <- LEFT + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", mid - dis, begin_pos + i, begin_pos + i, mid - dis); + matrix[mid - dis][begin_pos + (swap_n - i - 1)] = matrix[begin_pos + i][mid - dis]; + } + // LEFT <- DOWNER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid - dis, mid + dis, begin_pos + i); + matrix[begin_pos + i][mid - dis] = matrix[mid + dis][begin_pos + i]; + } + // DOWNER <- TEMP + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-tvec[%d]\n", mid + dis, begin_pos + i, i); + matrix[mid + dis][begin_pos + (swap_n - i - 1)] = tvec[i]; + } + + // debug + //print(matrix); + } + } + else // oh, this stuff sucks. + { + int mid = n / 2 ; + + for (int dis = 1; dis <= mid ; dis++) + { + // do chain swap at distance:dis + int swap_n = 2 * dis; + // save right col + vector tvec; + int begin_pos = mid - dis; + for (int i = 0; i < swap_n; i++) + { + tvec.push_back(matrix[begin_pos + i][mid + dis - 1]); + } + // start rotate + // RIGHT <- UPPER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid + dis, mid - dis, begin_pos + i); + matrix[begin_pos + i][mid + dis - 1] = matrix[mid - dis][begin_pos + i]; + } + // UPPER <- LEFT + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", mid - dis, begin_pos + i, begin_pos + i, mid - dis); + matrix[mid - dis][begin_pos + (swap_n - i - 1)] = matrix[begin_pos + i][mid - dis]; + } + // LEFT <- DOWNER + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-matrix[%d][%d]\n", begin_pos + i, mid - dis, mid + dis, begin_pos + i); + matrix[begin_pos + i][mid - dis] = matrix[mid + dis -1][begin_pos + i]; + } + // DOWNER <- TEMP + for (int i = 0; i < swap_n; i++) + { + //printf("matrix[%d][%d]<-tvec[%d]\n", mid + dis, begin_pos + i, i); + matrix[mid + dis -1][begin_pos + (swap_n - i - 1)] = tvec[i]; + } + + // debug + //print(matrix); + } + } + } +}; +``` +### puck + +```c++ +#include + +class Solution +{ + public: + void rotate(vector> &matrix) + { + auto n = matrix.size(); + auto max = n - 1; + auto half = n / 2; + + for (int i{}; i < half; ++i) + { + for (int j{}; j < half; ++j) + { + std::swap(matrix[i][j], matrix[j][max - i]); + std::swap(matrix[i][j], matrix[max - i][max - j]); + std::swap(matrix[i][j], matrix[max - j][i]); + } + } + + if (n == 2 * half + 1) + { + for (int i{}; i < half; ++i) + { + std::swap(matrix[i][half], matrix[half][max - i]); + std::swap(matrix[i][half], matrix[max - i][half]); + std::swap(matrix[i][half], matrix[half][i]); + } + } + } +}; +``` +## 4. 两个排序数组的中位数@2018/06/24 + +### 种子 似乎不符合复杂度限制 +```c++ +class Solution { +public: + double findMedianSortedArrays(vector& nums1, vector& nums2) { + copy(nums2.begin(),nums2.end(),back_inserter(nums1)); + sort(nums1.begin(),nums1.end()); + return nums1.size()%2?\ + double(nums1[nums1.size()/2]):\ + double(nums1[nums1.size()/2]+nums1[nums1.size()/2-1])/2; + } +}; +``` +### 北河 48ms +```c++ +class Solution { +public: + double findMedianSortedArrays(vector& nums1, vector& nums2) { + std::multiset v; + copy(nums1.begin(), nums1.end(), inserter(v, v.begin())); + copy(nums2.begin(), nums2.end(), inserter(v, v.begin())); + std::multiset::iterator p, q; + p = q = v.begin(); + return v.size() % 2 == 0 ? ((double)*(advance(p, v.size() / 2 - 1), p) + (double)*(advance(q, v.size() / 2), q))/ 2 : (double)*(advance(p, v.size() / 2), p); + } +}; +``` +### kiritow + +```c++ +#include +class Solution { +public: + void forward_until(vector& nums1, vector& nums2, + int lenA,int lenB, + int& idxA, int& idxB, int& passed, int midLen) + { + while (idxA < lenA&&idxB < lenB && passed < midLen) + { + if (nums1[idxA] < nums2[idxB]) + { + idxA++; + passed++; + } + else + { + idxB++; + passed++; + } + } + while (idxA < lenA&&passed < midLen) + { + idxA++; + passed++; + } + while (idxB < lenB&&passed < midLen) + { + idxB++; + passed++; + } + } + + int getCurrent(vector& nums1, vector& nums2, + int lenA,int lenB, + int idxA, int idxB) + { + if (idxA < lenA&&idxB < lenB) + { + return std::min(nums1[idxA], nums2[idxB]); + } + else if (idxA < lenA) + { + return nums1[idxA]; + } + else + { + return nums2[idxB]; + } + } + + double findMedianSortedArrays(vector& nums1, vector& nums2) { + int lenA = nums1.size(); + int lenB = nums2.size(); + int sumLen = lenA + lenB; + int midLen = sumLen / 2 - (1 - (sumLen % 2)); + int idxA = 0; + int idxB = 0; + int passed = 0; + + forward_until(nums1, nums2, lenA, lenB, idxA, idxB, passed, midLen); + + if (sumLen % 2) + { + return getCurrent(nums1, nums2, lenA, lenB, idxA, idxB); + } + else + { + int step1 = getCurrent(nums1, nums2, lenA, lenB, idxA, idxB); + + forward_until(nums1, nums2, lenA, lenB, idxA, idxB, passed, midLen + 1); + + int step2 = getCurrent(nums1, nums2, lenA, lenB, idxA, idxB); + + return (step1 + step2) / 2.0; + } + } +}; + +``` +### jzf + +算了,我就算是抄上边几个的吧。 + +### 小白 + +* 第一版 40ms +```c++ + +class Solution { +public: + + double findMedianSortedArrays(vector& nums1, vector& nums2) { + vector ab; + + std::merge(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), std::back_inserter(ab)); + + return (double(ab[(ab.size() >> 1) - !(ab.size() & 1)]) + double(ab[(ab.size() >> 1)])) *0.5; + } +}; +``` +* 第二版 + +```c++ +class Solution { +public: + + double findMedianSortedArrays(vector& nums1, vector& nums2) { + vector ab; + + std::merge(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), std::back_inserter(ab)); + + return (double(ab[(ab.size() >> 1) - !(ab.size() & 1)]) + double(ab[(ab.size() >> 1)])) *0.5; + } +}; +``` +* 第三版 40ms +```c++ + +class Solution { + +public: + + double findMedianSortedArrays(vector& nums1, vector& nums2) { + + vector ab; + + ab.reserve(nums1.size() + nums2.size()); + + std::merge(nums1.begin(), nums1.end(), nums2.begin(), nums2.end(), std::back_inserter(ab)); + + return double(ab[(ab.size() >> 1) - !(ab.size() & 1)] + ab[(ab.size() >> 1)]) * 0.5; + + } + +}; +``` + +### 总结 + +1,北河和种子的体现了使用STL的巨大优势,利用现有的工具,确实好很多。 + +而我在解题的过程中出现了自创轮子没本事放弃,和不熟悉STL等问题 + +2,算法还是要学的,STL的复杂度也要会分析 + +### 知识点 +1, std::merge +2,copy + +## 724. 寻找数组的中心索引@2018/06/25 + +### jzf 28ms +```c++ +class Solution { +public: + int pivotIndex(vector& nums) { + vector::iterator iter; + int sum =0; + int ret =-1; + for(iter =nums.begin();iter!=nums.end();iter++) + { + sum+=*iter; + } + + int tmp =0; + + for(size_t i=0;i=len?-1:i; +}; +``` +```c++ + +class Solution { +public: + int pivotIndex(vector& nums) { + int r = 0,l=0,len = nums.size(),i; + if(len<2)return -1; + for( i = 1; i < len; i++ )r += nums[i]; + for(i=0; l!=r && i=len?-1:i; + } +}; +``` +### puck +```c++ +#include + +class Solution +{ +public: + int pivotIndex(vector &nums) + { + int n{-1}; + auto iter = std::find_if(nums.begin(), nums.end(), [&](const int a) { + return ++n, std::accumulate(nums.begin(), nums.begin() + n, 0) == + std::accumulate(nums.begin() + n + 1, nums.end(), 0); + }); + + if (iter == nums.end()) + { + return -1; + } + return iter - nums.begin(); + } +}; +``` + +### 小白 +```c++ + +``` +## 5. 最长回文子串@2018/06/25 +### jzf +* 第一版 超时 +```c++ +class Solution { +public: + string longestPalindrome(string s) { + int len =s.size(); + string retStr=""; + for(size_t i = len; i>0;i--) + { + for(size_t j =0;j+i<=len;j++) + { + string str =s.substr(j,i); + string str2 =str; + reverse(str2.begin(),str2.end()); + + if(!str.compare(str2)) + { + retStr =str; + return retStr; + } + + } + } + return retStr; + } +}; +``` + +* 第二版 超时 +```c++ +class Solution { +public: + string longestPalindrome(string s) { + int len =s.size(); + string retStr=s.substr(0,1); + for(size_t i = len; i>1;i--) + { + for(size_t j =0;j+i<=len;j++) + { + string str =s.substr(j,i); + string str2 =str; + reverse(str2.begin(),str2.end()); + + if(!str.compare(str2)) + { + retStr =str; + return retStr; + } + + } + } + return retStr; + } +}; +``` +* 8ms +```c++ +class Solution { +public: +int func(string &str, int n) +{ + int ret = 1; + size_t k = 1; + for ( ;k <= n && (n + k)<=str.size(); k++) + { + if (str[n - k] == str[n + k + 1]) + { + ret ++; + } + else + { + break; + } + } + return ret; +} +int func2(string &str, int n) +{ + int ret = 1; + size_t k = 1; + for (; k <= n && (n + k+3) <= str.size(); k++) + { + if (str[n - k] == str[n + k+2]) + { + ret++; + } + else + { + break; + } + } + return ret; +} +string longestPalindrome(string s) { + int len = s.size(); + int max = 0; + int center = 0; + int f = 0; + if (len<2) + { + return s; + } + if (len == 2) + { + if (s[0] == s[1]) + { + return s; + } + else + { + return s.substr(0, 1); + } + } + + std::vector vec1; + for (size_t i = 0; imax) + { + max = tmp; + center = vec1[i]; + f = 1; + } + if (max + i>s.size()) + { + break; + } + } + std::vector vec2; + for (size_t i = 0; imax) + { + max = tmp ; + center = vec2[i]; + f = 2; + } + if (max + i>s.size()) + { + break; + } + } + if (f == 0) + { + return s.substr(0,1); + } + if (f == 1) + { + return s.substr(center - max+1, max * 2); + } + if (f == 2) + { + return s.substr(center -max+1, max * 2 + 1); + } +} +}; + +``` +### 小白 +* 第一版 超时 +```c++ +std::pair longestPalindrome(string::const_iterator a, string::const_iterator b) + +{ + + if (a==b || std::mismatch(a, b, make_reverse_iterator(b)).first == b) + + return std::make_pair(a, b); + + auto str1 = longestPalindrome(a + 1, b), str2 = longestPalindrome(a, b - 1); + + return (str1.second - str1.first) > (str2.second - str2.first) ? str1 : str2; + +} + +string longestPalindrome(const string &s) { + + auto pr = longestPalindrome(s.begin(), s.end()); + + return std::string(pr.first, pr.second); + +} +``` +```c++ + +class Solution { +public: + string longestPalindrome(string s) { + auto lr_max = std::make_pair( s.crend(), s.cbegin() ); + auto lr_dist_comp = [](decltype(lr_max) a, decltype(lr_max) b) + {return std::distance(a.first.base(), a.second) < + std::distance(b.first.base(), b.second); }; + for (auto cent = lr_max; cent != std::make_pair(s.crbegin(), s.cend()); std::distance(cent.first.base(), cent.second) == 0 ? ++cent.second : (--cent.first).base() ) + lr_max = std::max(lr_max, std::mismatch((cent.first - 1), s.crend(), cent.second), lr_dist_comp); + return std::string(lr_max.first.base(), lr_max.second); + } +}; + +``` + +## 384. 打乱数组@2018/06/26 +### jzf +```c++ +class Solution { + vector nums; +public: + Solution(vector nums) { + this->nums = nums; + } + + /** Resets the array to its original configuration and return it. */ + vector reset() { + return nums; + } + + /** Returns a random shuffling of the array. */ + vector shuffle() { + vector result(nums); + for (int i = 0;i < result.size();i++) { + int pos = rand()%(result.size()-i); + swap(result[i+pos], result[i]); + } + return result; + } +}; +``` +### 北河 +```c++ +class Solution { +public: + Solution(vector nums) :m_nums(nums.begin(), nums.end()) { + } + + /** Resets the array to its original configuration and return it. */ + vector reset() { + return m_nums; + } + + /** Returns a random shuffling of the array. */ + vector shuffle() { + vector v(m_nums.begin(), m_nums.end()); + random_shuffle(v.begin(), v.end()); + return v; + } +private: + vector m_nums; +}; +``` + +### 总结 +1, 北河的STL确实知道的很多,random_shuffle 惊艳了我 + +### 知识点 + +随机数 + +## 843. 猜猜这个单词@2018/06/26 +### 北河 +```c++ + +class Solution { + vector nums; +public: + Solution(vector nums) { + this->nums = nums; + } + + /** Resets the array to its original configuration and return it. */ + vector reset() { + return nums; + } + + /** Returns a random shuffling of the array. */ + vector shuffle() { + vector result(nums); + for (int i = 0;i < result.size();i++) { + int pos = rand()%(result.size()-i); + swap(result[i+pos], result[i]); + } + return result; + } +}; +``` +## 6. Z字形变换@2018/06/26 +### jzf +```c++ + +``` +## 180. 连续出现的数字@2018/06/26 +### jzf +```sql +select distinct s1.Num as ConsecutiveNums from Logs as s1 ,Logs as s2,Logs as s3 + where(( (s1.id= s2.id-1 and s1.id =s3.id-2) + ||(s1.id =s2.id+1 and s1.id =s3.id-1) + ||(s1.id =s2.id+2 and s1.id =s3.id+1)) + and(s1.Num =s2.Num and s1.Num =s3.Num)) +``` + +## 7. 反转整数@2018/06/27 +### jzf + +* 第一版 +```c++ +class Solution { +public: + int reverse(int x) { + char str[16]={0}; + sprintf(str,"%d",x); + string s =str; + if(s[0]=='-') + { + std::reverse(s.begin()+1,s.end()); + } + else + { + std::reverse(s.begin(),s.end()); + } + long ret =atol(s.c_str()); + + if(ret >INT_MAX||ret INT_MAX) ? 0 : res; + } +}; +``` +* 第三版 +```c++ +``` +### 小白 +* 第一版 出错 +```c++ +class Solution { +public: +int reverse(int x) { + + char str[12], *p = str + sprintf(str, "%d", x); + + std::reverse(str + (x < 0), p); + + int r = strtol(str, NULL, 10); + + return errno == ERANGE ? (errno = 0) : r; + +} +}; +``` + +* 第二版 +```c++ +int reverse(int x) { + auto str = to_string(x); + std::reverse(str.begin(), str.end()); + try + { + return str.back() == '-' ? -std::stoi(str): std::stoi(str); + } + catch (...) + { + return 0; + } + } +``` + +### 总结 + +1,他这边用 strtol 和spritnf("%ld")出错 + 原因不知 + +### 知识点 + +1,这边atoi strtoi 遇见不合适的字符会跳过,和停止 + +## 147. 对链表进行插入排序@2018/06/27 + +### 北河 16ms +```c++ +class Solution { +public: + ListNode* insertionSortList(ListNode* head) { + list v; + ListNode *p = head; + while (p) { v.push_back(p->val); p = p->next;} + v.sort(); + p = head; + for (list::iterator it = v.begin(); it != v.end(); ++it, p = p->next) { + p->val = *it; + } + return head; + } +}; +``` +### jzf +```c++ +class Solution { +public: + ListNode* insertionSortList(ListNode* head) { + ListNode* node =head; + if(head ==NULL) + { + return head; + } + vector vec; + while(node != NULL) + { + vec.push_back(node); + node =node->next; + } + sort(vec.begin(),vec.end(),[](ListNode*a,ListNode*b){return a->val val;}); + for(auto iter =vec.begin();iter!= vec.end();iter++) + { + if(iter==vec.end()-1) + { + (*iter)->next =NULL; + break; + } + (*iter)->next =*(iter+1); + + } + return *vec.begin(); + } +}; +``` +### puck + +```c++ + +class Solution +{ + public: + ListNode *insertionSortList(ListNode *head) + { + if (nullptr == head) + { + return nullptr; + } + + ListNode *fast{head->next}; + ListNode *slow{head}; + ListNode *new_head{head}; + ListNode *tmp[2]{}; + + while (nullptr != fast) + { + if (slow->val > fast->val) + { + // delete the node + slow->next = fast->next; + + if (new_head->val > fast->val) + { + fast->next = new_head; + new_head = fast; + } + else + { + tmp[0] = new_head; + tmp[1] = new_head->next; + while (nullptr != tmp[1]) + { + if (tmp[1]->val > fast->val) + { + fast->next = tmp[1]; + tmp[0]->next = fast; + break; + } + tmp[0] = tmp[1]; + tmp[1] = tmp[1]->next; + } + } + } + + slow = fast; + fast = fast->next; + } + + return new_head; + } +}; +``` + + + + +## 828. 独特字符串@2018/06/28 +### 北河 +```c++ + +``` +### jzf + +* 第一版超时 +```c++ +class Solution { +public: +int uniqueLetterString(string S) { + int sum = 0; + vector> vec; + for(size_t i =0;i> vecTmp; + vecTmp =vec; + vec.clear(); + string str=S.substr(i,1); + vec.push_back(make_pair(1,str)); + sum++; + if(i ==0) + { + continue; + } + for(size_t j=0;j> vec; + for(size_t i =0;i +#include + +class Solution +{ +public: + int uniqueLetterString(string S) + { + std::size_t sz = S.size(); + int result{}; + + auto ed = S.end(); + bool flg{true}; + for (auto iter{ S.begin() }; iter != ed; ++iter) + { + for (auto ite2{ 1 + iter }; flg; ++ite2) + { + if (ite2 == ed) + { + flg = false; + } + result += uniqueNum(string(iter, ite2)); + } + flg = true; + } + + return result; + } + +private: + int uniqueNum(string s) + { + //std::unordered_map map; + //for (string::value_type ch : s) + //{ + // ++map[ch]; + //} + + //int num{}; + //for (auto &pair : map) + //{ + // if (1 == pair.second) + // { + // ++num; + // } + //} + + //return num; + + short a[128]{}; + + for (string::value_type ch : s) + { + ++a[ch]; + } + + return std::count(std::begin(a), std::end(a), 1); + } +}; +``` + +## 693. 交替位二进制数@2018/06/29 + +### jzf +* 第一版 错误 +```c++ +class Solution { +public: + bool hasAlternatingBits(int n) { + // #define IS_TARGET(x) ((x&0xaaaaaaaa)&&(x&0x55555555)) + int x =n; + + if( ((x&0xaaaaaaaa)==x)&&((x|0xaaaaaaaa)==0xaaaaaaaa)) + { + int x =~n; + if( ((x&0x55555555)==x)&&((x|0x55555555)==0x55555555)) + { + return true; + } + else + { + return false; + } + } + + if( ((x&0x55555555)==x)&&((x|0x55555555)==0x55555555)) + { + int x =~n; + if( ((x&0xaaaaaaaa)==x)&&((x|0xaaaaaaaa)==0xaaaaaaaa)) + { + return true; + } + else + { + return false; + } + } + return false; + } +}; +``` + +* 第二版 0s +```c++ +class Solution { +public: + bool hasAlternatingBits(int n) { + + int tmp=0; + for(size_t i= n&1?0:1;i<31;) + { + tmp |=1<n) + { + return false; + } + else if(tmp ==n) + { + return true; + } + i +=2; + } + + return false; + + } +}; +``` + + +### 总结 + +1, 想通过按位与等方式解决问题的时候,对于异或同或之类的转换忘记了,结果绕了很大的弯子。数学还是要学一学的。 + +2,那个神奇的代码对提升速度真的很有效. + +## 63. 不同路径 II@2018/06/30 +### 北河 0ms +```c++ + +static auto XXX = []() { + ios::sync_with_stdio(false); + cin.tie(nullptr); + return 0; +}(); + +class Solution { +public: + int uniquePathsWithObstacles(vector>& obstacleGrid) { + int m = obstacleGrid.size(); + int n = obstacleGrid[0].size(); + int v[m][n]; + memset(v, 0, m * n * sizeof(int)); + for (int i = 0; i < m; ++i) { + for (int j = 0; j < n; ++j) { + if (obstacleGrid[i][j] != 0) { + continue; + } + if (i == 0 && j != 0) { + v[i][j] = v[i][j - 1]; + } else if (j == 0 && i != 0) { + v[i][j] = v[i - 1][j]; + } else if ( i != 0 && j != 0) { + v[i][j] += obstacleGrid[i - 1][j] > 0 ? 0 : v[i - 1][j]; + v[i][j] += obstacleGrid[i][j - 1] > 0 ? 0 : v[i][j - 1]; + } else { + v[i][j] = 1; + } + } + } + return v[m - 1][n - 1]; + } +}; +``` +### jzf +```c++ +class Solution { +public: + int uniquePathsWithObstacles(vector>& obstacleGrid) { + int dp[101] ={0}; + for(int i =0;i& A, vector& B) { + int max=0; + + + for(size_t i =0 ;imax) + { + max =tmp; + } + } + } + return max; + } +}; +``` +* 第二版 dp +```c++ + +``` +### 北河 +```c++ +static auto XX = []() { + ios::sync_with_stdio(false); + cin.tie(nullptr); + return 0; +}(); + +class Solution { +public: + int findLength(vector& A, vector& B) { + vector dp(1001); + int m = 0; + for (int i = A.size() - 1; i >= 0; --i) { + for (size_t j = 0; j < B.size(); ++j) { + if (A[i] == B[j]) { + dp[j] = dp[j + 1] + 1; + if (dp[j] > m) { + m = dp[j]; + } + } else { + dp[j] = 0; + } + } + } + return m; + } +}; + +``` +## 406. 根据身高重建队列@2018/07/02 未备份 + + +## 455. 分发饼干@2018/07/03 +### jzf +```c++ +class Solution { +public: + int findContentChildren(vector& g, vector& s) { + sort(g.begin(),g.end()); + sort(s.begin(),s.end()); + + int j =0; + int i=0; + int t =0; + for(;i10;q/=10) + { + s*=10; + } + for(;s>0;s/=10) + { + *(p++)=tmp/s+'0'; + tmp=tmp%s; + } + } + int monotoneIncreasingDigits(int N) { + // tostring(N); + char str[11]={0}; + tostr(N,str); + + int t=0; + for(size_t i=0;i<11 &&str[i]!=0;i++) + { + if(str[i] > str[i+1]) + { + t =i; + break; + } + } + if(t==0) + { + str[0]-=1; + for(int i= t+1;i<11 &&str[i]!=0;i++) + { + str[i] ='9'; + } + return turn2Int(str+t); + } + else if(str[t+1]==0) + { + return N;cout<<12; + } + else + { + int tmp =t; + while(t>0) + { + if(str[t]>str[t-1]) + { + str[t]-=1; + for(int i= t+1;i<11 &&str[i]!=0;i++) + { + str[i] ='9'; + } + return turn2Int(str); + } + t--; + } + + if(t==0) + { + + str[0]-=1; + for(int i= t+1;i<11 &&str[i]!=0;i++) + { + str[i] ='9'; + } + return turn2Int(str+t); + } + + } + return turn2Int(str+t); + } +}; +``` +## 313. 超级丑数@2018/07/05 无人做 +## 20. 有效的括号@2018/07/06 +### 羽柔子 +```javascript +var isValid = function (s) { + var l = new Array(); + return s.split("").every(e => { + switch (e) { + case '(': return l.push(1); + case ')': return l.pop() == 1; + case '{': return l.push(2); + case '}': return l.pop() == 2; + case '[': return l.push(3); + case ']': return l.pop() == 3; + }; + }) ? !l.length : false; +}; +``` +### jzf +* 第一版错误 +```c++ +class Solution { +public: + bool isClosed(char c, char dst) + { + switch (c) + { + case '[': + return dst == ']'; + case '{': + return dst == '}'; + case '(': + return dst == ')'; + default: + return false; + } + } + bool isOpen(char c) + { + switch (c) + { + case '[': + + case '{': + + case '(': + return true; + default: + return false; + } + } + bool check(size_t &i, string &s) + { + size_t j = i + 1; + bool ret=false; + for (; j0; k--) + { + + if (!isClosed(s[i + k], s[j - k])) + { + return false; + } + } + break; + } + } + i = j; + return ret; + } + bool isValid(string s) { + // '[''{''('')''}'']' + for (size_t i = 0; ip = (char *)malloc(size * sizeof(char)); + memset(pStack->p, 0, size); + pStack->iPos= 0; +} + +void DestroyStack(Stack *pStack) +{ + free(pStack->p); +} + +int Push(Stack *pStack, char ch) +{ + if (pStack->iPos >= 0) + { + *(pStack->p + pStack->iPos) = ch; + ++(pStack->iPos); + return 0; + } + return -1; +} + +int Pop(Stack *pStack) +{ + --(pStack->iPos); + if (pStack->iPos >= 0) + { + *(pStack->p + pStack->iPos) = '\0'; + return 0; + } + return -1; +} +char GetPairChar(char ch) +{ + switch (ch) + { + case ')': + return '('; + case '}': + return '{'; + + case ']': + return '['; + default: + return '\0'; + } +} + +bool IsPush(char ch) +{ + if (ch == '(' || ch == '{' || ch == '[') + { + return true; + } + return false; +} + +bool isValid(char *s) +{ + if ('\0' == *s) + { + return true; + } + int n = 0; + char chPre = *s; + if (!IsPush(chPre)) + { + return false; + } + + Stack myStack; + BulidStack(&myStack, strlen(s) + 1); + while (*s != '\0') + { + char chCur = *s; + if (IsPush(chCur)) + { + if (0 != Push(&myStack, chCur)) + { + return false; + } + } + else + { + if ((myStack.iPos >= 1) && + (myStack.p[myStack.iPos - 1] == GetPairChar(chCur))) + { + if (0 != Pop(&myStack)) + { + return false; + } + } + else + { + + if (0 != Push(&myStack, chCur)) + { + return false; + } + } + } + chPre = *s; + ++s; + } + if (0 == myStack.iPos) + { + DestroyStack(&myStack); + return true; + } + else + { + DestroyStack(&myStack); + return false; + } + +} +``` +### 总结 +1,我在做这道题的时候,出现了许多次的分析失误,疏忽了一些情形。 +2,发现 s.size()的返回类型是size_t ,遇到了一个比较悲惨的越界错误。 +size_t是unsigned int类型的 +当 for(int i=0; i