C/C++---------------LeetCode第2824. 统计和小于目标的下标对数目
统计和小于目标的下表对数目
- 题目及要求
- 暴力枚举
- 双指针
- 在main内使用
题目及要求
给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 target ,请你返回满足 0 <= i < j < n 且 nums[i] + nums[j] < target 的下标对 (i, j) 的数目。
示例 1:
输入:nums = [-1,1,2,3,1], target = 2
输出:3
解释:总共有 3 个下标对满足题目描述:
- (0, 1) ,0 < 1 且 nums[0] + nums[1] = 0 < target
- (0, 2) ,0 < 2 且 nums[0] + nums[2] = 1 < target
- (0, 4) ,0 < 4 且 nums[0] + nums[4] = 0 < target
注意 (0, 3) 不计入答案因为 nums[0] + nums[3] 不是严格小于 target 。
示例 2:
输入:nums = [-6,2,5,-2,-7,-1,3], target = -2
输出:10
解释:总共有 10 个下标对满足题目描述:
- (0, 1) ,0 < 1 且 nums[0] + nums[1] = -4 < target
- (0, 3) ,0 < 3 且 nums[0] + nums[3] = -8 < target
- (0, 4) ,0 < 4 且 nums[0] + nums[4] = -13 < target
- (0, 5) ,0 < 5 且 nums[0] + nums[5] = -7 < target
- (0, 6) ,0 < 6 且 nums[0] + nums[6] = -3 < target
- (1, 4) ,1 < 4 且 nums[1] + nums[4] = -5 < target
- (3, 4) ,3 < 4 且 nums[3] + nums[4] = -9 < target
- (3, 5) ,3 < 5 且 nums[3] + nums[5] = -3 < target
- (4, 5) ,4 < 5 且 nums[4] + nums[5] = -8 < target
- (4, 6) ,4 < 6 且 nums[4] + nums[6] = -4 < target
提示:
1 <= nums.length == n <= 50
-50 <= nums[i], target <= 50
暴力枚举
思路:定义ans用于记录数对,双循环逐个去查找,如果和小于目标则累加ans
class Solution {
public:int countPairs(vector<int>& nums, int target) {int n=nums.size();int ans=0;for(int i=0;i<n;++i){for(int j=i+1;j<n;++j){if(nums[i]+nums[j]<target)++ans;}}return ans;}
};
双指针
思路:先排序,然后定义两个指针分别指向头和尾,如果当前数字小于目标值则代表右指针到左指针之间的数字对都满足条件,全部加到ans内,最后不断移动指针完成遍历最后返回ans
class Solution {
public:int countPairs(vector<int>& nums, int target) {sort(nums.begin(), nums.end()); // 对数组进行排序int n = nums.size(); // 数组的大小int ans = 0; // 记录满足条件的数字对数量int i = 0, j = n - 1; // 定义两个指针,i指向开头,j指向末尾while (i < j) { // 当左指针小于右指针时,进行循环if (nums[i] + nums[j] >= target) { // 如果当前数字对之和大于等于目标值j--; // 右指针向左移动一位} else { // 如果当前数字对之和小于目标值ans += j - i; // 将右指针和左指针之间的数字对数量累加到答案中i++; // 左指针向右移动一位}}return ans; // 返回满足条件的数字对数量}
};
在main内使用
int main() {vector<int> nums = {1, 3, 4, 6, 8};int target = 7;int ans = 0;sort(nums.begin(), nums.end());ans = countPairs(nums, target);cout << "数字对之和至少为 " << target << " 的数量为: " << ans << endl;return 0;
}