學渣帶你刷Leetcode0015 三數之和

2021-10-05 04:18:48 字數 2541 閱讀 3264

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

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

示例:給定陣列 nums = [-1, 0, 1, 2, -1, -4],

滿足要求的三元組集合為:

[[-1, 0, 1],

[-1, -1, 2]

]乙個陣列,找到裡面三個數的和為0就行,都得找出來,之後不能有重複的。

(1)快排輸入陣列,呼叫系統的qsort函式,是根據二分法寫的,其時間複雜度為n*log(n)

void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

引數: 1 待排序陣列,排序之後的結果仍放在這個陣列中

2 陣列中待排序元素數量

3 各元素的占用空間大小(單位為位元組)

4 指向函式的指標,用於確定排序的順序(需要使用者自定義乙個比較函式)

講普通話, qsort(nums, numssize, sizeof(int), comp);//用自帶的排序

(2)結果長啥樣子

6個數,取三個數,如何都取出來形成結果是不是得很多,

(3)優化提速

暴力肯定超時,就用雙指標,以第乙個點為核心,之後移動l=i+1,r=numssize-1;

詳細解釋關注 b站  【c語言全**】學渣帶你刷leetcode 不走丟 

#include #include /**

* 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().

*/int comp(const void *_a,const void *_b) //const void *a這是定義了乙個指標a,a可以指向任意型別的值,但它指向的值必須是常量

//int** threesum(int* nums, int numssize, int* returnsize)

// //初始化結果陣列為numssize行*numssize列的

int** returnarray = (int**)malloc(sizeof(int*) * (numssize)*(numssize)); //cn3就夠了

// *returncolumnsizes = (int*)malloc(sizeof(int) * (numssize)*(numssize));

*returncolumnsizes = (int*)malloc(sizeof(int) * (numssize)*(numssize)); //returncolumnsizes【】【】 returncolumnsizes

//*returncolumnsizes = (int*)calloc(sizeof(int), *returnsize); //層序的最後要是這麼寫就沒有事

// for (int i = 0; i < *returnsize; i++)

qsort(nums, numssize, sizeof(int), comp);//用自帶的排序

int i;

for( i=0; i < numssize; i++)

if(i > 0 && nums[i] == nums[i-1]) //之前的找過了,再找會一樣,去重

int l = i+1, r = numssize-1;

while(l < r)

//去重3:右指標移動到最後1個相同元素

while(l < r && (nums[r] == nums[r-1]))

//雙指標例行移動1位

l++;

r--;

}else if(nums[i] + nums[l] + nums[r] < 0)

else}}

return returnarray;

}int main()

int **returncolumnsizes =(int**)malloc(sizeof(int*)*numssize);

int returnsize=0;

//輸出

int** resultarray = threesum( nums, numssize, &returnsize,returncolumnsizes);

printf("%d\n",returnsize);

for(i=0; i

printf("\n");

}return 0;

}

學渣帶你刷Leetcode0035搜尋插入位置

給定乙個排序陣列和乙個目標值,在陣列中找到目標值,並返回其索引。如果目標值不存在於陣列中,返回它將會被按順序插入的位置。你可以假設陣列中無重複元素。示例 1 輸入 1,3,5,6 5 輸出 2 示例 2 輸入 1,3,5,6 2 輸出 1 示例 3 輸入 1,3,5,6 7 輸出 4 示例 4 輸入...

學渣帶你刷Leetcode0063不同路徑 II

乙個機械人位於乙個 m x n 網格的左上角 起始點在下圖中標記為 start 機械人每次只能向下或者向右移動一步。機械人試圖達到網格的右下角 在下圖中標記為 finish 現在考慮網格中有障礙物。那麼從左上角到右下角將會有多少條不同的路徑?網格中的障礙物和空位置分別用 1 和 0 來表示。說明 m...

學渣帶你刷Leetcode0066加一

給定乙個由整數組成的非空陣列所表示的非負整數,在該數的基礎上加一。最高位數字存放在陣列的首位,陣列中每個元素只儲存單個數字。你可以假設除了整數 0 之外,這個整數不會以零開頭。示例 1 輸入 1,2,3 輸出 1,2,4 解釋 輸入陣列表示數字 123。示例 2 輸入 4,3,2,1 輸出 4,3,...