LeetCode 第315场周赛

第一题:

模拟

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值