[LeetCode两数和-小于或等于目标值] | 刷题打卡
一直有刷题习惯,最近才看到掘金举办了刷题活动,特来参加!此题为第4题。
本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
描述
给定一个整数数组,找出这个数组中有多少对的和是小于或等于目标值。返回对数。 样例
例1:
输入: nums = [2, 7, 11, 15], target = 24.
输出: 5.
解释:
2 + 7 < 24
2 + 11 < 24
2 + 15 < 24
7 + 11 < 24
7 + 15 < 24
例2:
输入: nums = [1], target = 1.
输出: 0.
二、思路分析:
双指针和二分查找都可以
方法 | 描述 | 时间复杂度 | 空间复杂度 |
|---|---|---|---|
| 双指针 | 相向双指针 | ||
| 双指针 | 初始化start、end,并对数组进行排序 | ||
| 双指针 | 对于当前start,找到最大的end即可,因为数组的单调性,start+1、start+2都是小于target的 | ||
| 双指针 | nums[start]+nums[end]<=target 即找到符合的end | ||
| 双指针 | 对于当前start,找到end的情况下,共有end-start个索引满足要求,此时end-- | ||
| 双指针 | 没找到的情况下,说明nums[start]过小,start++即可 |
三、AC 代码:
public class Solution {
/**
* @param nums: an array of integer
* @param target: an integer
* @return: an integer
*/
public int twoSum5(int[] nums, int target) {
// write your code here
// back conditons
if (nums == null || nums.length == 0) {
return 0;
}
Arrays.sort(nums);
int start = 0;
int end = nums.length - 1;
int targetCount = 0;
while (start < end) {
int searchTarget = nums[start] + nums[end];
if (searchTarget == target) {
// core code
targetCount += end - start;
start++;
} else if (searchTarget < target) {
// core code
targetCount += end - start;
start++;
} else if (searchTarget > target) {
end--;
}
}
return targetCount;
}
}
四、总结:
两数之和类的问题,可以使用双指针解决,此题仍然属于相向双指针范畴,与前三题不同的是小于target,注意处理没找到的情况和找到的情况。
- 找到
target,当前i开始有end-start个 - 没找到
target,对start右移 - 最重要一点,双指针之前一定要对数组排序