📅  最后修改于: 2023-12-03 15:39:36.179000             🧑  作者: Mango
给定一个整数数组 nums,编写一个函数来计算数组中的一对元素之和是否大于0,返回满足条件的对数。
暴力法通过两重循环枚举所有可能的数字对,并检查它们的总和是否大于0。时间复杂度为 $O(n^2)$。
public int getPairCount(int[] nums) {
int count = 0;
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[i] + nums[j] > 0) {
count++;
}
}
}
return count;
}
双指针法利用有序数组的特性,从两端开始向中间遍历,如果元素之和大于0,则右指针左移;如果元素之和小于等于0,则左指针右移。时间复杂度为 $O(n \log n)$。
public int getPairCount(int[] nums) {
Arrays.sort(nums);
int count = 0;
int left = 0, right = nums.length - 1;
while (left < right) {
int sum = nums[left] + nums[right];
if (sum > 0) {
count += right - left;
right--;
} else {
left++;
}
}
return count;
}
本题可以通过暴力法和双指针法两种方法解决。暴力法的时间复杂度较高,适用于数据规模较小的情况;双指针法的时间复杂度较低,适用于数据规模较大的情况。