解题思路

这是一道经典的三数之和判定题目,主要思路如下:

  1. 数组预处理:

    • 对输入数组进行排序
    • 排序后可以使用双指针优化搜索
  2. 三重循环优化:

    • 固定中间位置
    • 使用双指针(first和last)在 的两侧搜索
    • 根据三数之和与目标值的比较来移动指针
  3. 剪枝优化:

    • 利用排序后的性质
    • 当和小于目标值时,移动左指针
    • 当和大于目标值时,移动右指针

代码

#include <bits/stdc++.h>
using namespace std;

int main() {
    // 读取输入
    vector<int> nums;
    int x, target;
    
    // 读取数组
    while(cin >> x) {
        nums.push_back(x);
        if(getchar() == ',') break;
    }
    cin >> target;
    
    // 排序
    sort(nums.begin(), nums.end());
    
    // 固定中间位置,使用双指针搜索
    for(int i = 1; i < nums.size() - 1; i++) {
        int left = 0;
        int right = nums.size() - 1;
        
        while(left < i && right > i) {
            int sum = nums[left] + nums[i] + nums[right];
            if(sum == target) {
                cout << "True" << endl;
                return 0;
            }
            else if(sum < target) {
                left++;
            }
            else {
                right--;
            }
        }
    }
    
    cout << "False" << endl;
    return 0;
}
import java.util.*;
public class Main {
    public static void main(String[] args) {
        java.util.Scanner scanner = new java.util.Scanner(System.in);
        String str = scanner.nextLine();
        String[] temp = str.split(",");
        String[] numstr = temp[0].split(" ");
        int[] nums = new int[numstr.length];
        for (int i = 0; i < nums.length; i++)
            nums[i] = Integer.valueOf(numstr[i]);
        int target = Integer.valueOf(temp[1]);
        java.util.Arrays.sort(nums);
          
        for (int i = 0; i < nums.length - 2; i++) {
            int start = i + 1, end = nums.length - 1;
            while (start < end) {
                int sum = nums[i] + nums[start] + nums[end];
                if (sum == target){
                    System.out.println("True");
                    return;
                }  else if (sum < target)
                    start++;
                else
                    end--;
            }
        }
        System.out.println("False");
    }
}
def has_three_sum(nums, target):
    # 排序
    nums.sort()
    
    # 固定中间位置,使用双指针搜索
    for i in range(1, len(nums)-1):
        left = 0
        right = len(nums) - 1
        
        while left < i and right > i:
            curr_sum = nums[left] + nums[i] + nums[right]
            if curr_sum == target:
                return True
            elif curr_sum < target:
                left += 1
            else:
                right -= 1
    
    return False

def main():
    # 读取输入行并按逗号分割
    line = input().strip()
    parts = line.split(',')
    
    # 分离数组和目标值
    nums = [int(x) for x in parts[:-1]]  # 转换除最后一个元素外的所有数字
    target = int(parts[-1])  # 最后一个元素作为目标值
    
    # 输出结果
    print("True" if has_three_sum(nums, target) else "False")

if __name__ == "__main__":
    main()

算法及复杂度

  • 算法:排序 + 双指针
  • 时间复杂度: - 其中 为数组长度
  • 空间复杂度: - 只需要常数级别的额外空间