给定排序数组arr和整数k,不重复打印arr中所有相加和为k的不降序二元组
例如, arr = [-8, -4, -3, 0, 1, 2, 4, 5, 8, 9], k = 10,打印结果为:
1, 9
2, 8
[要求]
时间复杂度为
,空间复杂度为
第一行有两个整数n, k
接下来一行有n个整数表示数组内的元素
输出若干行,每行两个整数表示答案
按二元组从小到大的顺序输出(二元组大小比较方式为每个依次比较二元组内每个数)
10 10 -8 -4 -3 0 1 2 4 5 8 9
1 9 2 8
#include <bits/stdc++.h>
using namespace std;
int main(){
int n, k;
cin>>n>>k;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
int l=0, r=n-1;
while(l<r){
if(a[l]+a[r]==k){
if(l==0 || a[l]!=a[l-1])
cout<<a[l]<<" "<<a[r]<<endl;
l++;
r--;
}else if(a[l]+a[r]<k)
l++;
else
r--;
}
return 0;
} import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
int i = 0;
int j = n - 1;
while (i < j) {
int sum = arr[i] + arr[j];
if (sum < k) {
i++;
} else if (sum > k) {
j--;
} else {
if (i == 0 || arr[i] != arr[i - 1] || j == n - 1) {
System.out.println(arr[i] + " " + arr[j]);
}
i++;
j--;
}
}
}
}
if __name__=='__main__': aa=list(map(int,input().split())) bb=list(map(int,input().split())) bb=list(set(bb)) bb=sorted(bb) i=0 j=len(bb)-1 target=1 while i<j: if (bb[i]+bb[j])<aa[1]: i+=1 elif (bb[i]+bb[j])==aa[1]: print(bb[i],bb[j]) i+=1 j-=1 else: j-=1有个疑问,为什么这个通过率为60%,思想也是双指针的
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
vector<int>num(n);
for(int i=0;i<n;i++)
cin>>num[i];
int i=0,j=n-1;
while(i<j)
{
if(num[i]+num[j]<k)
i++;
else if(num[i]+num[j]>k)
j--;
else
{
if(i==0||num[i]!=num[i-1]||j==n-1)
cout<<num[i]<<" "<<num[j]<<endl;
i++;
j--;
}
}
return 0;
} #接收用户输入的两个整数 n,k = map(int,input().split()) #将n个整数存放到列表中 ls = list(map(int,input().split())) #先排个序,不用排序,因为是有序数组 #ls.sort() #i,j赋初值,从首尾开始向中间遍历 i, j = 0, n-1 while i < j: if ls[i]+ls[j] < k: #小于k,i向后 i += 1 elif ls[i]+ls[j] == k: #当存在一个形如(1 9)的组合时,跳过1之后的1和9之前的9 print(ls[i], ls[j]) while ls[i]==ls[i+1]: i += 1 while ls[j] == ls[j-1]: j -= 1 #有重复则跳过,同时i,j向中间收缩 i += 1 j -= 1 else: #大于k,j向前 j -= 1
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] params = br.readLine().split(" ");
int n = Integer.parseInt(params[0]), k = Integer.parseInt(params[1]);
String[] strArr = br.readLine().split(" ");
int[] arr = new int[n];
for(int i = 0; i < n; i++) arr[i] = Integer.parseInt(strArr[i]);
int left = 0, right = n - 1;
while(left < right) {
if(arr[left] + arr[right] < k){
left ++;
}else if(arr[left] + arr[right] > k){
right --;
}else{
if(left == 0 || arr[left] != arr[left - 1])
System.out.println(arr[left] + " " + arr[right]);
left ++;
right --;
}
}
}
} //这一题只要清楚不能出现重复的就可以,直接用map更方便一些
#include<iostream>
#include<vector>
#include<map>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
vector<int>data(n);
for(int i=0;i<n;++i)
cin>>data[i];
map<int,int>res;
auto p=data.begin();
auto q=data.end()-1;
while(p!=q){
if(*p+*q==k){
if(res.find(*p)==res.end())
res[*p]=*q;
++p;
if(p==q) break;
else --q;
}
else if(*p+*q<k)
++p;
else
--q;
}
for(auto ptr=res.begin();ptr!=res.end();++ptr)
cout<<ptr->first<<" "<<ptr->second<<endl;
return 0;
}
第6个示例没过,求大佬指点
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner scanner=new Scanner(System.in);
int n=scanner.nextInt();
int k=scanner.nextInt();
HashSet<Integer>set=new HashSet<Integer>();
int arr[]=new int[n];
for(int i=0;i<n;i++){
arr[i]=scanner.nextInt();
set.add(arr[i]);
}
for(int i=0;i<n-1;i++){
int temp=k-arr[i];
if(set.contains(temp)&arr[i]<temp){
System.out.println(arr[i]+" "+temp);
set.remove(temp);
}
}
}
} import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int K = sc.nextInt();
int []arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
printByOrder(K, arr);
}
private static void printByOrder(int k, int[] arr) {
int i = 0;
int j =arr.length - 1;
while(i < j){
if (arr[i] + arr[j] < k) i++;
else if(arr[i] + arr[j] > k) j--;
else {
if (i == 0|| arr[i] != arr[i -1]){
System.out.print(arr[i]);
System.out.print(" ");
System.out.println(arr[j]);
}
i++;
j--;
}
}
}
}
#include<bits/stdc++.h>
using namespace std;
int main(){
long n,k,a[100005];
scanf("%ld%ld",&n,&k);
for(int i=0;i<n;i++){
scanf("%ld",&a[i]);
}
for(int i=0,j=n-1;i<j;){
int x=a[i]+a[j];
if(x==k){
printf("%ld %ld\n",a[i++],a[j--]);
while(a[i]==a[i-1])i++;
while(a[j]==a[j+1])j--;
}else if(x>k){
j--;
}else{
i++;
}
}
}
#include<iostream>
#include<vector>
#include<set>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
vector<int> matrix(n,0);
for(int i=0;i<n;++i){
cin>>matrix[i];
}
int i=0,j=n-1;
while(i<j){
if(matrix[i]+matrix[j]<k) ++i;
else if(matrix[i]+matrix[j]>k) --j;
else{
if(i==0 || matrix[i]!=matrix[i-1]){
cout<<matrix[i]<<" "<<matrix[j]<<endl;
}
++i;
--j;
}
}
return 0;
} #include<iostream>
#include<vector>
using namespace std;
int main()
{
int n, k;
int first = 0;
cin>>n>>k;
int last = n - 1;
vector<int> arr(n);
for(int i = 0; i < n; i++)
{
cin>>arr[i];
}
while(first < last)
{
if(arr[first]+arr[last] == k)
{
cout<<arr[first]<<" "<<arr[last]<<endl;
while(arr[last] == arr[last-1])
{
last--;
}
last--;
while(arr[first] == arr[first+1])
{
first++;
}
first++;
}else{
while(arr[first] == arr[first+1])
{
first++;
}
first++;
}
}
return 0;
} var lines=readline().split(' ')
var arr=readline().split(' ')
var l=0,r=lines[0]-1
while(l<r){
if(parseInt(arr[l])+parseInt(arr[r])==lines[1]){
if(l==0||arr[l]!=arr[l-1]){ //判断是否重复
print(arr[l]+' '+arr[r])
}
l++
r--
} else if(arr[l]+arr[r]<lines[1]){
l++
} else {
r--
}
} #include <bits/stdc++.h>
using namespace std;
int main(){
int n, k;
cin>>n>>k;
vector<int> v(n);
for(int i=0;i<n;++i)
cin>>v[i];
int left=0, right=n-1;
while(left < right){
if(left>0 && v[left]==v[left-1]){ // 左指针遇到相等的元素直接跳过,避免答案出现重复组合
++left;
continue;
}
// int sum = v[left] + v[right]; 这种写法有越界的风险
int diff = k - v[left];
if(diff == v[right]){
cout<<v[left]<<" "<<v[right]<<endl;
++left;
}
else if(diff < right)
--right;
else
++left;
}
return 0;
} #include <iostream>
#include <vector>
using namespace std;
int main(){
int n, k;
cin>>n>>k;
vector<int> arr(n, 0);
for(int i = 0; i < n; i++) cin>>arr[i];
int l = 0, r = n-1, tmp;
while(l < r){
tmp = arr[l] + arr[r];
if(tmp > k){
r--;
while(arr[r] == arr[r+1]) r--;
}else if(tmp < k){
l++;
while(arr[l] == arr[l-1]) l++;
}else{
cout<<arr[l]<<' '<<arr[r]<<endl;
l++; r--;
while(arr[l] == arr[l-1]) l++;
while(arr[r] == arr[r+1]) r--;
}
}
return 0;
} #include <iostream>
#include <vector>
using namespace std;
int main(){
int n,k;
cin>>n>>k;
vector<int>v(n);
for(int i = 0;i<n;++i){
cin>>v[i];
}
int left = 0,right = n-1;
while(left < right){
int cursum = v[left] + v[right];
// 去除重复的值
if(cursum == k){
cout<<v[left]<<" "<<v[right]<<endl;
++left;
while(v[left] == v[left-1]){
++left;
}
--right;
while(v[right] == v[right+1]){
--right;
}
}
else if(cursum > k){
--right;
}else{
++left;
}
}
return 0;
}