15. 3Sum

此題先取一個數(shù),再在后面的數(shù)中找 2 個數(shù)的和為所取數(shù)的相反數(shù),容易得時間復雜度為 O(n^2) ,為簡化代碼編寫,我們先用 O(nlogn) 的時間對數(shù)組進行排序,再進行遍歷查找。想法的基本代碼實現(xiàn)還是比較簡單的,更重要的是要注意對于一些特殊情況的處理,包括:

三個數(shù)的組合可能在不同位置,但是這三個數(shù)數(shù)值是一樣的,對已經出現(xiàn)過的組合不能重復輸出;
選第一個數(shù)出來后,從剩余的數(shù)中篩選可能出現(xiàn)多種組合,因此找到一組可行組合時要繼續(xù)往下找;
如果所選的數(shù)大于 0 ,那么可以不再繼續(xù)查找了,因為排序的數(shù)組不可能出現(xiàn)三個大于 0 的和為 0 。

/**
 * Return an array of arrays of size *returnSize.
 * Note: The returned array must be malloced, assume caller calls free().
 */
int cmp(const void*a,const void*b)  {return *(int*)a-*(int*)b;}


/** 
 * Return an array of arrays of size *returnSize. 
 * Note: The returned array must be malloced, assume caller calls free(). 
 */  
int**  
threeSum(int* nums, int numsSize, int* returnSize){  
    if (numsSize <= 0) return NULL;  
    int total = 64;  
    int size = 0;  
    int i,start,end,sum;  
    int ** result = (int **)malloc(sizeof(int *) * total);  
  
    for(i = 0 ;i< total; i++){  
        result[i] = (int *)malloc(sizeof(int)* 3);  
    }  
    qsort(nums, numsSize, sizeof(int), cmp);  
      
    for(i = 0; i < numsSize-2; ++i){  
        
        if(nums[i] > 0)
            break;
        if(i > 0 && nums[i] == nums[i-1]){  
            continue;  
        }  

        start = i + 1;  
        end = numsSize - 1;  
        while(start < end){  
            sum = nums[i] + nums[start] + nums[end];  
            if(sum == 0){  
                if(size > 0 && result[size-1][0] == nums[i] &&  
                   result[size-1][1] == nums[start] && result[size-1][2] == nums[end]){  
                    ++start;  
                    --end;  
                    continue;  
                }  
                result[size][0] = nums[i];  
                result[size][1] = nums[start];  
                result[size][2] = nums[end];  
                size++;  
                  
                if(size == total){  
                    total <<= 1;  
                    int t;  
                    result = (int **)realloc(result,sizeof(int *) * total);  
                    for(t = size; t < total; ++t)  
                        result[t] = (int *)malloc(sizeof(int) * 3);  
                }  
                ++start;  
                --end;  
            } else if(sum > 0){  
                --end;  
            }else{  
                ++start;  
            }  
        }  
    }  
      
    *returnSize = size;  
    return result;  
}  
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,927評論 0 33
  • 概述 排序有內部排序和外部排序,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,303評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數(shù)據(jù)記錄在內存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,829評論 0 15
  • 十大名茶 西湖龍井(浙江杭州西湖區(qū)),碧螺春(江蘇吳縣太湖的洞庭山碧螺春),信陽毛尖(河南信陽車云山),君山銀針(...
    挽悠閱讀 444評論 0 1
  • 人,是一種很奇怪的物種。無論哪朝哪代還是哪國哪組,幾乎都會有一個詞匯:后悔。 人一路向前,卻總會有理由回望,并對某...
    就是喜歡遮臉閱讀 149評論 0 0

友情鏈接更多精彩內容