# [LeetCode两数和-小于或等于目标值] | 刷题打卡

1,009 阅读1分钟

[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. 

二、思路分析:

双指针和二分查找都可以

方法
描述
时间复杂度
空间复杂度
双指针相向双指针O(N)O(N)(1)(1)
双指针初始化startend,并对数组进行排序O(N)O(N)(1)(1)
双指针对于当前start,找到最大的end即可,因为数组的单调性,start+1start+2都是小于target的O(N)O(N)(1)(1)
双指针nums[start]+nums[end]<=target 即找到符合的endO(N)O(N)(1)(1)
双指针对于当前start,找到end的情况下,共有end-start个索引满足要求,此时end--O(N)O(N)(1)(1)
双指针没找到的情况下,说明nums[start]过小,start++即可O(N)O(N)(1)(1)

三、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右移
  • 最重要一点,双指针之前一定要对数组排序