天天看點

LeetCode刷題15-簡單-三數之和☀️ 前言 ☀️🙀 作者簡介 🙀💗 一、題目描述 💗💁 二、題目解析 💁🏃 三、代碼 🏃🌔 結語 🌔

LeetCode刷題15-簡單-三數之和☀️ 前言 ☀️🙀 作者簡介 🙀💗 一、題目描述 💗💁 二、題目解析 💁🏃 三、代碼 🏃🌔 結語 🌔

文章目錄

算法作為極其重要的一點,是大學生畢業找工作的核心競争力,是以為了不落後與人,開始刷力扣算法題!

大家好,我是布小禅,一個盡力讓無情的代碼變得生動有趣的IT小白,很高興能偶認識你,關注我,每天堅持學點東西,我們以後就是大佬啦!

📢 :

❤布小禅❤ 📢 作者專欄: ❤Python❤ ❤Java❤ ❤力扣題❤ 這是我刷第 87/100 道力扣簡單題

給你一個包含 n 個整數的數組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有和為 0 且不重複的三元組。

注意:答案中不可以包含重複的三元組。

來源:力扣(LeetCode)

連結:

https://leetcode-cn.com/problems/3sum

著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

示例1:

輸入:nums = [-1,0,1,2,-1,-4]
輸出:[[-1,-1,2],[-1,0,1]]      

示例2:

輸入:nums = []
輸出:[]      

提示:

0 <= nums.length <= 3000

-105 <= nums[i] <= 105

思路1

\- 空數組/元素數目小于3傳回空

   \- 排序原數組

   \- 周遊排序後的數組

   \- 使用二分法找到三數之和

   細節處理:

   \- 目前數組大于0,表示後續沒有三數之和為0,結束周遊

   \- 目前元素與上一次相等,跳過此次計算,去重      

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
 /*
   - 空數組/元素數目小于3傳回空
   - 排序原數組
   - 周遊排序後的數組
   - 使用二分法找到三數之和
   細節處理:
   - 目前數組大于0,表示後續沒有三數之和為0,結束周遊
   - 目前元素與上一次相等,跳過此次計算,去重
 */
 /* qsort的比較函數 */
int cmp(const void* a, const void* b) {
    return *(int*)a - *(int*)b;
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    /* 先記錄傳回的行數為0 */
    *returnSize = 0;
    /* 輸入為空、或元素個數小于3則傳回NULL */
    if (nums == NULL || numsSize < 3) {
        return NULL;
    }
    /* 将nums排序為升序排列 */
    qsort(nums, numsSize, sizeof(int), cmp);
    /* 配置設定傳回數組、傳回數組的列數 */
    int** ret = (int**)malloc(numsSize * numsSize * sizeof(int*));
    *returnColumnSizes = (int*)malloc(numsSize * numsSize *sizeof(int));
    /* 排序後的數組從頭到尾進行周遊 */
    for (int i = 0; i < numsSize; i++) {
        /* 目前數組大于0,表示後續沒有三數之和為0,結束周遊 */
        if (nums[i] > 0) {
            break;
        }
        /* 目前元素與上一次相等,跳過此次計算,去重 */
        if (i > 0 && nums[i] == nums[i - 1]) {
            continue;
        }
        /* 定義左右指針 */
        int left = i + 1, right = numsSize - 1;
        /* 開始查找三數之和為0 */
        while (left < right) {
            int sum = nums[i] + nums[left] + nums[right];
            if (sum == 0) {
                ret[*returnSize] = (int*)malloc(sizeof(int) * 3);
                ret[*returnSize][0] = nums[i];
                ret[*returnSize][1] = nums[left];
                ret[*returnSize][2] = nums[right];
                /* 傳回數組目前行的列數為3 */
                (*returnColumnSizes)[*returnSize] = 3;
                /* 傳回數組的行數自加1 */
                (*returnSize)++;
                /* 對左右指針進行去重 */
                while (left < right && nums[left]  == nums[++left]);
                while (left < right && nums[right] == nums[--right]);
            } else if (sum < 0) {
                left++;
            } else {
                right--;
            }
        }
    }
    return ret;
}
      

堅持最重要,每日一題必不可少!😸

期待你的關注和督促!😛

LeetCode刷題15-簡單-三數之和☀️ 前言 ☀️🙀 作者簡介 🙀💗 一、題目描述 💗💁 二、題目解析 💁🏃 三、代碼 🏃🌔 結語 🌔