• 【leetcode】15. 三数之和


    int CompareByIncrease(const void* a, const void* b){
        return *(int*)a - *(int*)b; // 快排构造递增序列
    }
    int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
        *returnSize = 0;
        if( numsSize < 3 )
            return NULL;
        int cur = 0; // 相当于自变量,low和high的和相当于它的相反数
        int low = cur + 1;
        int high = numsSize - 1;   
        // LeetCode 用realloc报错,malloc本以该分配A(3)(numsSize)排列空间,但是还报错,无奈用了平方,有什么解决办法?
        int** returnArray = (int**)malloc(sizeof(int*) * (numsSize)*(numsSize));
        *returnColumnSizes = (int*)malloc(sizeof(int) * (numsSize)*(numsSize)); // 新版增加的参数,用来返回列数?还不能直接用 
        // 调用stdlib库的快速排序函数
        qsort(nums, numsSize, sizeof(int), CompareByIncrease);   
        // 第一层循环用来遍历cur,第二层循环用来双指针往中间夹
        while((nums[cur] <= 0) && (cur + 1 < numsSize - 1)) // 当相反数大于0时停下,后面的都是正数了,肯定不可能
        {
            // 每次更新
            low = cur + 1;
            high = numsSize - 1;       
            while(low < high && nums[cur]+nums[low]<=0)
            {
                if(0 == (nums[low] + nums[high] + nums[cur]))
                {
                    returnArray[*returnSize] = (int*)malloc(sizeof(int) * 3); // 每次找到一组,二级指针就分配三个空间         
                    returnArray[*returnSize][0] = nums[cur];
                    returnArray[*returnSize][1] = nums[low];
                    returnArray[*returnSize][2] = nums[high];
                    (*returnColumnSizes)[(*returnSize)++] = 3; // 记录列数,非常骚而吊诡的操作
                    while( (nums[low] == nums[++low]) && (low < high) ); // 往后去重
                    while( (nums[high] == nums[--high]) && (low < high) ); // 往前去重
                }
                else if(0 < (nums[low] + nums[high] + nums[cur]))
                    high--;
                else
                    low++;
            }
            while( (nums[cur] == nums[++cur]) && (cur + 1 < numsSize - 1) ); // 往后去重,同时cur往后移  
        }
        return returnArray;
    }
  • 相关阅读:
    最大值及下标值
    查找整数
    打印沙漏
    抓老鼠啊~亏了还是赚了?
    币值转换
    秋季学期学习总结
    菜鸟学习Spring——SpringIoC容器基于三种配置的对比
    yanxin8文章归档
    2014——2015总结
    Java入门到精通——调错篇之Spring2.5利用aspect实现AOP时报错: error at ::0 can't find referenced pointcut XXX
  • 原文地址:https://www.cnblogs.com/ganxiang/p/14099142.html
Copyright © 2020-2023  润新知