zoukankan      html  css  js  c++  java
  • 三数之和

    /*
    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素a,b,c,使得 a + b + c = 0 ?
    请你找出所有满足条件且不重复的三元组。
    
    注意:答案中不可以包含重复的三元组。
    [
      [-1, 0, 1],
      [-1, -1, 2]
    ]
    
    */
    #include<stdio.h>
    #include<malloc.h>
    #include<string.h>
    #include<stdlib.h>
    #include<math.h>
    #include<string.h>
    #include <iostream>
    int getMax(int a,int b){
        if(a>b)
            return a;
        return b;
    }
    int getMin(int a,int b){
        if(a<b)
            return a;
        return b;
    }
    
    void print(int nums[],int n){
        int i;
        for(i=0;i<n;i++){
            printf("%d ",nums[i]);
        }
        printf("
    ");
    }
    void printD(int a[][3],int col,int row){
        int i,j;
        for(i=0;i<col;i++){
            for(j=0;j<row;j++){
                printf("%d ",a[i][j]);
            }
            printf("
    ");
        }
    }
    void sortNums(int nums[],int n){
        int i,j,temp;
        for(i=0;i<n;i++){
            for(j=0;j<n-i-1;j++){
                if(nums[j]>nums[j+1]){
                    temp=nums[j];
                    nums[j]=nums[j+1];
                    nums[j+1]=temp;
                }
            }
        }
    }
    int CompareByIncrease(const void* a,const void *b){
        return *(int *)a-*(int*)b;
    }
    int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
        qsort(nums,numsSize,sizeof(int),CompareByIncrease);
        int k,i,j,temp,target;
        int **returnArray = (int**)malloc(sizeof(int*)*(numsSize)*(numsSize));
        for(k=0;k<numsSize-2;k++){
            if(k>0&&k+2<numsSize&&nums[k]==nums[k-1])
                continue;
            i=k+1;
            j=numsSize-1;
            target=-nums[k];
            while(i<j){
                if(nums[i]+nums[j]==target){
                    returnArray[*returnSize] = (int*)malloc(sizeof(int)*3);
                    returnArray[*returnSize][0]=nums[k];
                    returnArray[*returnSize][1]=nums[i];
                    returnArray[*returnSize][2]=nums[j];
                    (*returnSize)++;
                    i++;
                    j--;
                    while(i<j&&nums[i]==nums[i+1])
                        i++;
                    while(i<j&&nums[j]==nums[j-1])
                        j--;
                }else if(nums[i]+nums[j]>target){
                    j--;
                }else{
                    i++;
                }
            }
        }
        return returnArray;
    
    }
    int main()
    {
        int **rs,nums[] = {-1, 0, 1, 2, -1, -4},numsSize=6,* returnSize,** returnColumnSizes,(*p)[3],i,j;
        rs = threeSum(nums,numsSize,returnSize,returnColumnSizes);
        for(i=0;i<2;i++){
            for(j=0;j<3;j++){
                printf("%d ",*(*(p+i)+j));
            }
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    多项式模板整理
    广大附中2019CSP模拟day6
    2019正睿CSP-S模拟赛十连测day6
    NOIP2020 游记
    NOI2020 退役记
    CSP2019 退役记
    目录
    NOI Online 提高
    后缀数组
    待学
  • 原文地址:https://www.cnblogs.com/zhaohuan1996/p/12606281.html
Copyright © 2011-2022 走看看