第一题:
模拟
class Solution {
public:
int findMaxK(vector<int>& nums) {
sort(nums.begin(), nums.end());
unordered_set<int> set;
for(int d : nums) set.insert(d);
for(int i = nums.size() - 1; i >= 0; i--){
if(set.find(0 - nums[i]) != set.end()) return nums[i];
}
return -1;
}
};
第二题:
模拟
class Solution {
public:
int countDistinctIntegers(vector<int>& nums) {
unordered_set<int> set;
for(int d : nums){
set.insert(d);
int re = 0;
while(d != 0){
re = re*10 + d%10;
d /= 10;
}
set.insert(re);
}
return set.size();
}
};
第三题:
暴力遍历
class Solution {
public:
bool sumOfNumberAndReverse(int num) {
for(int i = 0; i <= num; i++){
int num1 = i;
int num2 = 0;
while(num1 != 0){
num2 = num2*10 + num1%10;
num1 /= 10;
}
if(i + num2 == num){
// cout << i <<" "<<num2;
return true;
}
}
return false;
}
};
第四题:
自己写的代码,会超时
class Solution {
public:
long long countSubarrays(vector<int>& nums, int minK, int maxK) {
int size = nums.size();
long long ans = 0;
vector<long long> vec(size, 0);
for(int i = 0; i < size; i++){
int j = i;
int tempMin = INT_MAX;
int tempMax = INT_MIN;
while(j >= 0){
tempMin = tempMin < nums[j] ?tempMin:nums[j];
tempMax = tempMax > nums[j] ?tempMax:nums[j];
if(tempMin < minK || maxK < tempMax) break;
if(tempMin == minK && tempMax == maxK){
if(minK <= nums[j] && maxK >= nums[j]){
ans++;
}else{
break;
}
}
j--;
}
}
return ans;
}
};
大佬的代码:
思路就是,min_i是上一次min_k的位置,max_i是上一次max_k的位置,i0是上一次不在[min_k,max_k]范围的位置,对个每个nums[i] == min_k或者nums[i]==max_k的位置就行计算。
class Solution {
public:
long long countSubarrays(vector<int> &nums, int min_k, int max_k) {
long long ans = 0L;
int n = nums.size(), min_i = -1, max_i = -1, i0 = -1;
for (int i = 0; i < n; ++i) {
int x = nums[i];
if (x == min_k) min_i = i;
if (x == max_k) max_i = i;
if (x < min_k || x > max_k) i0 = i; // 子数组不能包含 nums[i0]
ans += max(min(min_i, max_i) - i0, 0);
}
return ans;
}
};