11. Container With Most Water
思路:暴力窮舉每兩對形成的area即可,將其與maxArea進行比較並更新。
初始化的maxArea設置爲0合理,並且寫好代碼後可發現不必對特殊情況再做進一步處理。
class Solution {
public:
int maxArea(vector<int>& height) {
int n = height.size();
int area = 0;
int maxA = 0;
for (int i = 0; i < n-1; i++) {
for (int j = i+1; j < n; j++) {
area = (j-i)*min(height[i],height[j]);
if (area > maxA) {
maxA = area;
}
}
}
return maxA;
}
};
15. 3Sum
思路:借鑑2Sum的夾擠思路,將時間複雜度由O(n^3)降爲O(n^2logn),複雜度推導:注意這種夾擠做法必須有序,所以無序數組先排序。
在遍歷過程中,第一層遍歷三元組中最左數字...這種方式真正實現了組合數遍歷,而不是排列數,是寫題過程中非常常用的簡單優化。
所求結果不能含重複三元組,
get:
疑問:夾緊法爲什麼正確?夾緊法能找全嗎?
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
int len = nums.size();
sort(nums.begin(), nums.end());
set<vector<int>> vecSet;
for (int i = 0; i < len-2; i++) {
int j = i+1;
int k = len-1;
int needNum = -nums[i];
while(j < k) {
if (nums[j]+nums[k] < needNum) {
j++;
} else if (nums[j]+nums[k] > needNum) {
k--;
} else {
vecSet.insert(vector<int>{nums[i],nums[j],nums[k]});
while(j<k && nums[j] == nums[j+1]) {
j++;
}
j++;
}
}
}
vector<vector<int>> vecVector;
vecVector.assign(vecSet.begin(), vecSet.end());
return vecVector;
}
};