第一题
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;
}
};