LeetCode Weekly Contest 257

第一題

class Solution {
    public int countQuadruplets(int[] nums) {
        int n = nums.length;
        int res = 0;
        for(int i=0; i<n; i++){
            for(int j=i+1; j<n; j++){
                for(int k=j+1; k<n; k++){
                    for(int t =k+1; t < n; t++){
                        if(nums[i]+nums[j]+nums[k] == nums[t]){
                            res++;
                        }
                    }
                }
            }
        }
        return res;
    }
}

第二題


題解:使用單調棧

class Solution {
public:
    int numberOfWeakCharacters(vector<vector<int>>& p) {
        sort(p.begin(), p.end(), [](const auto &a, const auto &b){
            if(a[0] == b[0]) return a[1] > b[1];
            return a[0] < b[0];
        });
        
        stack<pair<int, int>> s;
        int n = p.size();
        int count = 0;
        for(int i=0; i<n; i++){
            while(s.size() > 0 &&  s.top().first < p[i][0] && s.top().second < p[i][1]){
                count++;
                s.pop();
            }
            s.push({p[i][0], p[i][1]});
        }
        return count;
    }
};

第三題

參考題解

class Solution {
public:
    int firstDayBeenInAllRooms(vector<int>& a) {
        int n = a.size();
        int mod = 1000000007;
        vector<int> f(n, 0);
        for(int i=1; i<n; i++){
            // 第一次到達 f[i-1] 的天數爲 f[i-1]
           // 第二次到達 f[i-1] 的天數爲 1 + f[i-1] - f[nextVisit[i-1]]
           // f[i] = (f[i-1] + (1 + f[i-1] - f[nextVisit[i-1]]) + 1) % MOD;
            f[i] = (2*f[i-1]-f[a[i-1]]+2)%mod;
            if(f[i] < 0) f[i] += mod;
        }
        return f[n-1];
    }
};

第四題

使用並查集

const int N = 1e5+10;
int p[N];
class Solution {
public:
    int find(int x){
        if(x != p[x])
          p[x] = find(p[x]);
        return p[x];
    }
    void merge(int a, int b){
        int x = find(a), y = find(b);
        if(x !=y){
            p[x] = y;
        }
    }

    bool gcdSort(vector<int>& nums) {
        vector<int> nums1 = nums;
        for(int i=1; i<N; i++) p[i] = i;
        for(int num : nums1){
            int k = num;
            for(int i=2; i<=num/i; i++){
                bool flag = false;
                while(num%i == 0){
                    num /= i;
                    flag = true;
                }
                if(flag){
                    merge(k, i);
                }
            }
            if(num > 1){
                merge(k, num);
            }
        }
        sort(nums.begin(), nums.end());
        for(int i=0; i<nums.size(); i++){
            if(nums[i] == nums1[i]) continue;
            if(find(nums[i]) != find(nums1[i])) return false;
        }
        return true;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章