力扣第 72 场双周赛:5996. 统计数组中相等且可以被整除的数对 5997. 找到和为给定整数的三个连续整数 5998. 拆分成最多数目的偶整数之和

力扣第 72 场双周赛(AC前三道题):

5996. 统计数组中相等且可以被整除的数对

  • 通过的用户数3399
  • 尝试过的用户数3432
  • 用户总通过次数3438
  • 用户总提交次数4206
  • 题目难度Easy
    给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k ,请你返回满足 0 <= i < j < n ,nums[i] == nums[j] 且 (i * j) 能被 k 整除的数对 (i, j) 的 数目 。
示例 1:
输入:nums = [3,1,2,2,2,1,3], k = 2输出:4解释:
总共有 4 对数符合所有要求:
- nums[0] == nums[6]0 * 6 == 0 ,能被 2 整除。
- nums[2] == nums[3]2 * 3 == 6 ,能被 2 整除。
- nums[2] == nums[4]2 * 4 == 8 ,能被 2 整除。
- nums[3] == nums[4]3 * 4 == 12 ,能被 2 整除。
示例 2:
输入:nums = [1,2,3,4], k = 1输出:0解释:由于数组中没有重复数值,所以没有数对 (i,j) 符合所有要求。

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i], k <= 100

思路:暴力搜索

代码

class Solution {
public:
    int countPairs(vector<int>& nums, int k) {
        int i,j,n,count=0;
        n=nums.size();
        for(i=0;i<n;i++)
        {
            for(j=i+1;j<n;j++)
            {
                if(nums[i]==nums[j]&&(i*j)%k==0)
                {
                    count++;
                    // printf("%d,%d\n",i,j);
                }
            }
        }
        return count;
    }
};

5997. 找到和为给定整数的三个连续整数

  • 通过的用户数3337
  • 尝试过的用户数3421
  • 用户总通过次数3366
  • 用户总提交次数5054
  • 题目难度Medium
    给你一个整数 num ,请你返回三个连续的整数,它们的 和 为 num 。如果 num 无法被表示成三个连续整数的和,请你返回一个 空 数组。
示例 1:
输入:num = 33输出:[10,11,12]解释:33 可以表示为 10 + 11 + 12 = 3310, 11, 123 个连续整数,所以返回 [10, 11, 12] 。
示例 2:
输入:num = 4输出:[]解释:没有办法将 4 表示成 3 个连续整数的和。

提示:

  • 0 <= num <= 1015

思路

缩小三个数的范围减小时间复杂度

代码

class Solution {
public:
    vector<long long> sumOfThree(long long num) {
        vector<long long> res;
        int length=1e6;
        for(long long i=num/3-length;i<num/3+length;i++)
        {
            if(i*3+3==num)
            {
                res.push_back(i);
                res.push_back(i+1);
                res.push_back(i+2);
                return res;
            }
        }
        return res;
    }
};

5998. 拆分成最多数目的偶整数之和

  • 通过的用户数2545
  • 尝试过的用户数2856
  • 用户总通过次数2607
  • 用户总提交次数5179
  • 题目难度Medium
    给你一个整数 finalSum 。请你将它拆分成若干个 互不相同 的偶整数之和,且拆分出来的偶整数数目 最多 。
  • 比方说,给你 finalSum = 12 ,那么这些拆分是 符合要求 的(互不相同的偶整数且和为 finalSum):(2 + 10) ,(2 + 4 + 6) 和 (4 + 8) 。它们中,(2 + 4 + 6) 包含最多数目的整数。注意 finalSum 不能拆分成 (2 + 2 + 4 + 4) ,因为拆分出来的整数必须互不相同。
    请你返回一个整数数组,表示将整数拆分成 最多 数目的偶整数数组。如果没有办法将 finalSum 进行拆分,请你返回一个 空 数组。你可以按 任意 顺序返回这些整数。
示例 1:
输入:finalSum = 12输出:[2,4,6]
解释:以下是一些符合要求的拆分:(2 + 10)(2 + 4 + 6)(4 + 8)(2 + 4 + 6) 为最多数目的整数,数目为 3 ,所以我们返回 [2,4,6][2,6,4][6,2,4] 等等也都是可行的解。

示例 2:
输入:finalSum = 7输出:[]
解释:没有办法将 finalSum 进行拆分。所以返回空数组。

示例 3:
输入:finalSum = 28输出:[6,8,2,12]
解释:以下是一些符合要求的拆分:(2 + 26)(6 + 8 + 2 + 12)(4 + 24)(6 + 8 + 2 + 12) 有最多数目的整数,数目为 4 ,所以我们返回 [6,8,2,12][10,2,4,12][6,2,4,16] 等等也都是可行的解。

提示:

  • 1 <= finalSum <= 1010

思路

  • 从小往大找,直到和sum大于finalSum
  • 尽可能的拆分,只能是从最小开始,直到下一个数加入会大于finalSum,对最后一位数进行补全
  • 对满足的最后一个 i 进行判断
    • finalSum-sum>i,即最后一个数为finalSum-sum
    • finalSum-sum<i,即删除已有的最后一个数,替换为finalSum-sum-(i-2)

代码

class Solution {
public:
    vector<long long> maximumEvenSplit(long long finalSum) {
        vector<long long> res;
        if(finalSum%2==1)   return res;
        long long sum=0,i;
        for(i=2;(sum+i+2)<=finalSum;i+=2)
        {
            sum+=i;
            res.push_back(i);
        }
        if((finalSum-sum)<i)//退一位凑数
        {
            res.pop_back();
            sum-=(i-2);
            res.push_back(finalSum-sum);
        }
        else if((finalSum-sum)>i)//补数
            res.push_back(finalSum-sum);
        return res;
    }
};
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值