11-20

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;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章