这里写目录标题
力扣第 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 = 33 。
10, 11, 12 是 3 个连续整数,所以返回 [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;
}
};