两数之和&c语言实现

题目描述:

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解题思路:我原先想的是先将数组的值保存到一个二维数组中,其中第一列保存值,第二列保存原来数组的下标,然后对第一列进行排序,第一列经排序后按照从小到大的顺序表示,第二列存储的还是这些值原先所对应的下标,然后我们用j从右往左开始和target进行比较,直至找到第一个比target小的值,然后用i从左往右取值和第一个比target小的值相加,然后和target进行比较,如果等于,则返回,如果比target小则i的值加1,如果比target大,则j的值减1。代码如下:
int* twoSum(int* nums, int numsSize, int target) {
    int *num;
    int i,j,temp;
    
    num=(int *)malloc(sizeof(int)*2);
    int (*Nums)[2]=(int(*)[2])malloc(sizeof(int)*numsSize*2);
    
    for(i=0;i<numsSize;i++){
        Nums[i][0]=nums[i];
        Nums[i][1]=i;
    }
    
    for(i=0;i<numsSize;i++){
        for(j=i+1;j<numsSize;j++){
            if(Nums[i][0]>Nums[j][0]){
                temp=Nums[i][0];
                Nums[i][0]=Nums[j][0];
                Nums[j][0]=temp;
                temp=Nums[i][1];
                Nums[i][1]=Nums[j][1];
                Nums[j][1]=temp;
            }
        }
    }
    

    for(j=numsSize-1;j>=1;j--){
        for(i=0;i<j;i++){
            if((Nums[i][0]+Nums[j][0])==target){
                num[0]=Nums[i][1];
                num[1]=Nums[j][1];
                return num;
            }
            else if((Nums[i][0]+Nums[j][0])<target)
                continue;
            else if((Nums[i][0]+Nums[j][0])>target)
                break;
        }
    } 
    return 0;
}

这个时间复杂度为o(n^2),有很多值得改进的地方,比如,在排序的时候,我选用的是冒泡排序,如果换用快速排序,则时间复杂度会降低很多,再者当我对这个有序数组进行查找的时候,使用的也是双重循环,所以复杂度也是o(n^2),这个地方其实也是可以进行优化的。
后来想想直接来个像冒泡排序那样的双重循环,也能解决问题吧,于是就有了下面的代码。
int* twoSum(int* nums, int numsSize, int target) {
    int *num;
    int i,j;
    
    num=(int *)malloc(sizeof(int)*2);
    for(i=0;i<numsSize;i++){
        for(j=i+1;j<numsSize;j++){
            if(nums[i]+nums[j]==target){
                num[0]=i;
                num[1]=j;
                return num;
            }
        }
    }
    return 0;
}
欢迎留言评论交流

猜你喜欢

转载自blog.csdn.net/betterc5/article/details/80351624