15. 三數之和_(c語言版)
1. 題目描述
給你一個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重複的三元組。
注意:答案中不可以包含重複的三元組。
示例:
給定陣列 nums = [-1, 0, 1, 2, -1, -4],
滿足要求的三元組集合為:
[
[-1, 0, 1],
[-1, -1, 2]
]
2. 測試結果
3. 解法1_雙指標法
/*
author: xidoublestar
date: 2020-5-21
*/
int compare(const void* a, const void* b)
{
return (*(int*)a - *(int*)b);
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
//排除平臺只輸出]的bug
*returnSize = 0;
//排除輸入小於3的情況
if (numsSize < 3)
return NULL;
//使用qsort函式快速排序
qsort(nums, numsSize, sizeof(int), compare);
//申請二級指標空間
int** returnArray = (int**)malloc(sizeof(int*) * (numsSize - 2) * (numsSize - 2));
//申請每個一維陣列大小的空間
*returnColumnSizes = (int*)malloc(sizeof(int) * (numsSize - 2) * (numsSize - 2));
int cur = 0, low = 0,high = 0;
//cur遍歷陣列,low和high分別做為左值和右值的下標往中間夾
while (nums[cur] <= 0 && cur < numsSize - 2) {
low = cur + 1;
high = numsSize - 1;
while (low < high) {
if (0 == (nums[cur] + nums[low] + nums[high])) {
returnArray[*returnSize] = (int*)malloc(sizeof(int) * 3);//每找到一組,二級指標分配3個空間
(*returnColumnSizes)[*returnSize] = 3;//記錄列數
returnArray[*returnSize][0] = nums[cur];
returnArray[*returnSize][1] = nums[low];
returnArray[(*returnSize)++][2] = nums[high];
while ((nums[low] == nums[++low]) && (low < high));//往後去重
while ((nums[high] == nums[--high]) && (low < high));//往前去重
}
else if (0 < (nums[cur] + nums[low] + nums[high])) {
high--;
}
else {
low++;
}
}
while ((nums[cur] == nums[++cur]) && (cur < numsSize - 2));//cur左值去重
}
return returnArray;
}
4、複雜度分析
時間複雜度:O(n*n)
空間複雜度:O(1)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31442014/viewspace-2693524/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 15.三數之和
- LeetCode 15.三數之和LeetCode
- LeetCode - 15. 三數之和 2LeetCode
- (js)leetcode 15. 三數之和JSLeetCode
- Day 7| 454.四數相加II 、383. 贖金信 、15. 三數之和 、18. 四數之和
- 兩數之和,三數之和,最接近的三數之和,四數之和
- C語言學習之求各因子之和C語言
- day7雜湊表 454.四數相加II |383. 贖金信|15. 三數之和 |18. 四數之和
- 三數之和
- Leetcode第一題:兩數之和(3種語言)LeetCode
- C語言:求4x4矩陣外圍元素之和C語言矩陣
- 57. 三數之和 &&
- C 語言版執行緒池執行緒
- 關於大數(C語言)C語言
- 1354: 素數判定(C語言)C語言
- 程式碼隨想錄演算法訓練營day07|454.四數相加II,383.贖金信,15.三數之和,18.四數之和演算法
- Go語言效能優化-兩數之和演算法效能研究Go優化演算法
- 程式碼隨想錄刷題day 7 | 雜湊表part02 454.四數相加II 383. 贖金信 15. 三數之和 18. 四數之和
- LeetCode15.三數之和LeetCode
- LeetCode15. 三數之和LeetCode
- C語言編譯器手機版C語言編譯
- c語言 構造素數表C語言
- C語言:迴文數計算C語言
- C語言sizeof()變數、字元、字串C語言變數字元字串
- C語言輸出多位小數C語言
- C++11新特性(三):語言特性C++
- C語言簡易三子棋C語言
- LeetCodeHot100 283. 移動零 11. 盛最多水的容器 42. 接雨水 15. 三數之和LeetCode
- 【C/C++】C語言基礎知識【第二版】C++C語言
- C語言入門經典(第5版)C語言
- C語言C語言
- C語言萌新上手:數列分段C語言
- 判斷水仙花數C語言C語言
- C語言可變引數詳解C語言
- 演算法題:三數之和演算法
- c語言筆記:楊輝三角C語言筆記
- 聊聊C語言/C++—程式和程式語言C語言C++
- JavaScript 函數語言程式設計(三)JavaScript函數程式設計