思路: 好久没写代码了,加上之前写的双指针并不多。我对双指针比较刻板的印象一直是两层for循环i,j,初始时i,j都位于左界附近,但是对于第i次的内层循环,j只需要从第i-1次内层循环停下时的j开始循环,即内层的循环变量j一直在增加,而不会减少,故双指针复杂度O(n)。 然鹅,本题利用双指针l,r,初始分别位于左界和右界,之后++l和--r,这样子移动。 至于如何移动,写出容器容量公式便很容易想出V=(r - l - 1) * min(height[l], height[r])。为取得Vmax,考虑无论移动l or r,都会使得宽d = r - l - 1变小,故考虑如何使得min(height[l], height[r])变大,容易发现应该移动height小的那一个。 AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
classSolution { public: intmaxArea(vector<int>& height){ int n = height.size(); int l = 0, r = n - 1; int s = (r - l) * min(height[l], height[r]); int res = s; while(l < r) { if(height[l] < height[r]) ++l; else --r; s = (r - l) * min(height[l], height[r]); res = max(res, s); } return res; } };
classSolution { public: vector<vector<int>> threeSum(vector<int>& nums) { int n = nums.size(); sort(nums.begin(), nums.end()); vector<vector<int>> ans; constint inf = 0x3f3f3f3f;
int x, y, l, r, last; for(int i = 0; i < n; ++i) { if(i != 0 && nums[i] == nums[i - 1]) continue; x = nums[i]; y = -nums[i]; l = i + 1; r = n - 1; last = inf;
while(l < r) { if(nums[l] + nums[r] == y) { ans.push_back({nums[i], nums[l], nums[r]}); last = nums[l]; while(nums[++l] == last && l != n - 1) ; } elseif(nums[l] + nums[r] < y) ++l; else --r; } }
classSolution { public: inttrap(vector<int>& height){ stack<int> st; int n = height.size(); int res = 0; for(int i = 0; i < n; ++i) { while(!st.empty() && height[i] > height[st.top()]) { int tp = st.top(); st.pop(); if(st.empty()) break; int l = st.top(); int d = i - l - 1; int h = min(height[l], height[i]) - height[tp]; res += d * h; } st.push(i); }
map<char, int> mp; //hash,'a'~'z'对应1~26,'A'~'Z'对应27~52 int cnt_s[64] //cnt_s[i]表示当前子串s[l~r]中i对应的字母个数,cnt_t[i]表示 intcnt_t[64]; //cnt_t[i]表示t串中i对应的字母一共有几个 int num = 0, cnt = 0; //num表示t串一共有多少个不同的字母,cnt表示当前子串s[l~r]已经覆盖了t中的字母个数 int l, r; //当前正在处理的子串s[l~r] int min_l, min_r, mi = inf; //目前所有处理的子串中能覆盖的最小子串的左右边界及长度
int n = matrix.size(); int m = matrix[0].size(); bool col = false, row = false; //column = 列,row = 行 for(int i = 0; i < n; ++i) { if(!matrix[i][0]) { col = true; break; } }
for(int i = 0; i < m; ++i) { if(!matrix[0][i]) { row = true; break; } }
for(int i = 1; i < n; ++i) { for(int j = 1; j < m; ++j) { if(!matrix[i][j]) matrix[i][0] = matrix[0][j] = 0; } }
for(int i = 1; i < n; ++i) { for(int j = 1; j < m; ++j) { if(!matrix[i][0] || !matrix[0][j]) matrix[i][j] = 0; } }
if(col) for(int i = 0; i < n; ++i) matrix[i][0] = 0; if(row) for(int i = 0; i < m; ++i) matrix[0][i] = 0; } };
intst_rand(vector<vector<int>>& matrix) { int xx = matrix.size(); int yy = matrix[0].size(); srand(time(NULL)); int st; bool flag; while(true) { st = rand(); flag = false; for(int i = 0; i < xx; ++i) { for(int j = 0; j < yy; ++j) { if(matrix[i][j] == st) { flag = true; break; } } if(flag) break; } return st; } }
voidwork(vector<vector<int>>& matrix, int x, int y, int st) { int xx = matrix.size(); int yy = matrix[0].size(); for(int i = 0; i < xx; ++i) if(matrix[i][y] != 0) matrix[i][y] = st; for(int i = 0; i < yy; ++i) if(matrix[x][i] != 0) matrix[x][i] = st; }
voidsetZeroes(vector<vector<int>>& matrix){
int xx = matrix.size(); int yy = matrix[0].size(); int st = st_rand(matrix); for(int i = 0; i < xx; ++i) { for(int j = 0; j < yy; ++j) { if(matrix[i][j] == 0) work(matrix, i, j, st); } }
classSolution { public: boolsearchMatrix(vector<vector<int>>& matrix, int target){ int n = matrix.size(); int m = matrix[0].size(); int i = 0, j = m - 1; while(i < n && j >= 0) { if(matrix[i][j] == target) returntrue; elseif(matrix[i][j] < target) ++i; else --j; }