解题思路
这是一道经典的三数之和判定题目,主要思路如下:
-
数组预处理:
- 对输入数组进行排序
- 排序后可以使用双指针优化搜索
-
三重循环优化:
- 固定中间位置
- 使用双指针(first和last)在
的两侧搜索
- 根据三数之和与目标值的比较来移动指针
- 固定中间位置
-
剪枝优化:
- 利用排序后的性质
- 当和小于目标值时,移动左指针
- 当和大于目标值时,移动右指针
代码
#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()
算法及复杂度
- 算法:排序 + 双指针
- 时间复杂度:
- 其中
为数组长度
- 空间复杂度:
- 只需要常数级别的额外空间