机试题 三数之和变形-三数和赛高数组02 存在
数组a 存在 i、j、k 能找到l,使得ai + aj + ak = al,那么这个数组就是被称为三数和赛高数组,特别的i、j、k需要满足(1 <= i < j < k <= n, 1 <= l <= n)。
输入:
首先 t (1 <= t <= 1000) 代表t组数据。
然后 每组数据先输入一个n (3 <= n <= 200000), 代表数组的长度为n,接下来是n个数字a1,a2,……,an (-10^9 <= ai <= 10^9)
输出:
每组数据,如果是三数和赛高数组就输出"YES",否则输出"NO"
test1
input:
4 3 1 0 -1 5 1 -2 -2 1 -3 6 0 0 0 0 0 0 4 -1 2 -3 4
output:
YES YES YES NO
my code
#include <iostream> #include <vector> #include <unordered_set> #include <algorithm> using namespace std; void solution() { int n; cin >> n; vector<int> nums(n); unordered_set<int> uset; for (int i = 0; i < n; ++i){ cin >> nums[i]; uset.insert(nums[i]); } sort(nums.begin(), nums.end()); // 外循环 int sum; for (int i = 0; i < n; ++i) { // 双指针 缩小搜索范围 if (i > 0 && nums[i] == nums[i-1]) continue; bool flag = true; for (int l = i + 1, r = n - 1; flag && l < r; ) { sum = nums[i] + nums[l] + nums[r]; if (sum < nums[0]) { while(++l < r && nums[l-1] == nums[l]) ; } else if (sum > nums[n - 1]) { while(l < --r && nums[r+1] == nums[r]) ; } else { for (int j = l; flag && j <= r - 1; ++j) { for (int k = l + 1; flag && k <= r; ++k) { sum = nums[i] + nums[j] + nums[k]; // 不符合了 退出三层for循环 if (sum < nums[0] || sum > nums[n - 1]) { flag = false; break; } else if (uset.find(sum) != uset.end()) { cout << "YES" << endl; return; } } flag = false; } } } } cout << "NO" << endl; return; } int main() { int t; cin >> t; while(t--) solution(); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具