
文章目錄
算法作為極其重要的一點,是大學生畢業找工作的核心競争力,是以為了不落後與人,開始刷力扣算法題!
大家好,我是布小禅,一個盡力讓無情的代碼變得生動有趣的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;
}
堅持最重要,每日一題必不可少!😸
期待你的關注和督促!😛