voidmerge(vector<int>& nums1, int m, vector<int>& nums2, int n){ vector<int> b; b.clear(); int i = 0, j = 0; for( ; i < m || j < n;) { if((j == n) || ( i < m && nums1[i] <= nums2[j])) { b.push_back(nums1[i++]); } else b.push_back(nums2[j++]); }
for(i = 0; i < n+m; i++) nums1[i] = b[i]; }
27.移除元素
双指针扫描互换即可。
26.删除有序数组中的重复项
按照条件筛选元素,条件为不与前驱相同的元素。
用覆盖的思路处理即可。
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { public: intremoveDuplicates(vector<int>& nums){ int k = 1; for(int i = 1; i < nums.size(); i++) { if(nums[i] != nums[i-1]) { nums[k++] = nums[i]; } } return k; } };
80.删除有序数组中的重复项 II
在上一题基础上加一个前驱的前驱即可。
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution { public: intremoveDuplicates(vector<int>& nums){ if(nums.size() <= 1) return nums.size(); int k = 2; for(int i = 2; i < nums.size(); i++) { if(nums[i] != nums[k-1] || nums[i] != nums[k-2]) { nums[k++] = nums[i]; } } return k; } };
169.多数元素
求众数方法。计数,相同则加,不同则减,减到0更换预选数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: intmajorityElement(vector<int>& nums){ int ans = nums[0]; int k = 1; for(int i = 1; i < nums.size(); i++) { if(ans == nums[i]) k++; else k--; if(!k) { k = 1; ans = nums[i]; } } return ans; } };
189.轮转数组
前后调换,三次逆转即可。
121.买卖股票的最佳时机
维护一个前缀最小值,动态更新答案。
122.买卖股票的最佳时机 II
贪心。记录折现转折点,在最低点买入最高点卖出即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: intmaxProfit(vector<int>& prices){ int n = prices.size(); if(n <= 1) return0; int l = prices[0], r = prices[0], ans = 0; for(int i = 1; i < n; i++) { if(prices[i] >= prices[i-1]) { r = prices[i]; } else { ans += r-l; l = r = prices[i]; } } ans += r-l; return ans; } };
intindexOfVal(int val){ int H = hash(val); if(vec[H].empty() || value.empty()) return-1; for(int i = 0; i < vec[H].size(); i++) { int index = vec[H][i]; if(index == -1) continue; if(value[index] == val) return index; } return-1; }
boolinsert(int val){ if(indexOfVal(val) != -1) returnfalse; value.push_back(val); int index = value.size()-1; int H = hash(val); vec[H].push_back(index); returntrue; }
boolremove(int val){ int index = indexOfVal(val); if(index == -1) returnfalse; int n = value.size(); int last = value[n-1];
int H = hash(last); for(int i = 0; i < vec[H].size(); i++) { if(vec[H][i] == n-1) vec[H][i] = index; }
H = hash(val); for(int i = 0; i < vec[H].size(); i++) { if(vec[H][i] == index) vec[H][i] = -1; }