3 条题解
-
2
先排序好 负数左 整数右 然后一个个排注意正负数的变化 while的话在这题很合适 没必要for(很多朋友用for)
#include <iostream> #include <algorithm> using namespace std; int main(){ int n; cin >> n; int a[100005]; for(int i=0;i<n;i++) cin >> a[i]; sort(a,a+n); int l=0,r=n-1,cnt=0; while(l<r) { int sum=a[l]+a[r]; if(sum==0) { cnt++; l++;r--; } else if(sum<0) l++; else r--; } cout<<cnt; return 0; } -
0
#include<bits/stdc++.h> using namespace std; int main(){ ios::sync_with_stdio(false); cin.tie(0); int n,a[100001],r,l=1,t=0; cin>>n; r=n; for(int i=1;i<=n;i++){ cin>>a[i]; } sort(a+1,a+n+1); while(r>l){ int ma=a[l]+a[r]; if(ma==0){ t++; r--; l++; } if(ma>0)r--; if(ma<0)l++; } cout<<t; return 0; }
-
-1
73.和为零(广赋张老师的题解)
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; int a[100005]; for (int i = 0; i < n; i++) { cin >> a[i]; } sort(a, a+n);// 1. 排序 // 2. 双指针查找 int left = 0, right = n - 1; int count = 0; for(int i=0;i<n;i++){ int sum = a[left]+a[right]; if(sum==0){ //找到了目标数对,两个指针向中间移动 count++; left++; right--; } if(sum<0){left++;} //左指针的数太小了,左指针向中间移动 if(sum>0){right--;} //右指针的数太大了,右指针向中间移动 if(left>right){break;}//如果两个指针碰撞,结束循环 } cout<<count; return 0; }
- 1
信息
- ID
- 73
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 126
- 已通过
- 29
- 上传者