LeetCode Weekly Contest 257
阿新 • • 發佈:2021-09-05
第一題
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;
}
};