lc5-三数之和,最接近三数之和,四数之和

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
using namespace std;
void threeSum(int num[],int n){//三数之和
    sort(num,num+n);
    if(n==0)
        return;
    if(num[0]>0||num[n-1]<0){
        return ;
    }
    for(int k=0;k<n-2;k++){
        if(num[k]>0){
            return;
        }
        if(0!=k && num[k]==num[k-1]){
            continue;
        }
        int i=k+1,j=n-1;
        int target=0-num[k];
        while(i<j){
            if(num[i]+num[j]>target){
                j--;
            }
            else if(num[i]+num[j]<target){
                i++;
            }
            else{
                printf("{%d,%d,%d}",num[k],num[i],num[j]);
                j--;
                i++;
                while(i<j&&num[i]==num[i-1]){
                    i++;
                }
                while(i<j&&num[j]==num[j+1]){
                    j--;
                }
            }
        }
    }
}
int threeSumcloset(int sum[],int target,int n){//最接近的三数之和
    int temp=9999999;
    int closesum;
    int t=0;
    sort(sum,sum+n);
    if(n<3){
        return -1;
    }
    for(int i=0;i<n-2;i++){
        int left=i+1,right=n-1;
        while(left<right){
            int sum1=sum[i]+sum[left]+sum[right];
            if(sum1==target){
                return 0;
            } 
            int closesum=abs(sum1-target);
            if(closesum<temp){
                t=sum1;
                temp=closesum;
            }
            if(sum1<target){
                left++;
            }
            else if(sum1>target){
                right--;
            }
        }
    }
    return t;
}
void fournumbersum(int sum[],int target,int n){//四数之和
    if(n<4)
        return;
    if(n==4&&sum[0]+sum[1]+sum[2]+sum[3]==target){
        printf("{%d,%d,%d,%d}",sum[0],sum[1],sum[2],sum[3]);
        return;
    }
    sort(sum,sum+n);
    for(int i=0;i<n-3;i++){
        if(i!=0&&sum[i]==sum[i-1]){
            continue;
        }
        for(int j=i+1;j<n-2;j++){
            if(j!=i+1&&sum[j]==sum[j-1]){
                continue;
            }
            int left=j+1,right=n-1;
            while(left<right){
                int s=sum[i]+sum[j]+sum[left]+sum[right];
                if(s<target){
                    left++;
                }
                else if(s>target){
                    right--;
                }
                else{
                    printf("{%d,%d,%d,%d}",sum[i],sum[j],sum[left],sum[right]);
                    left++;
                    right--;
                    while(left<right&&sum[left]==sum[left-1]){
                        left++;
                    }
                    while(left<right&&sum[right]==sum[right+1]){
                        right--;
                    }
                }

            }
        }
    }
}
int main(){
    int n,target;
    scanf("%d%d",&n,&target);
    int a[100];
    for(int i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    //threeSum(a,n);
    //printf("%d\n",threeSumcloset(a,target,n));
    fournumbersum(a,target,n);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容