日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

算法笔记-两数之和、三数之和、四数之和(LeetCode)

發(fā)布時間:2025/3/8 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法笔记-两数之和、三数之和、四数之和(LeetCode) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

兩數(shù)之和

1.兩數(shù)之和
題目:給定一個整數(shù)數(shù)組 nums 和一個目標值 target,請你在該數(shù)組中找出和為目標值的那 兩個 整數(shù),并返回他們的數(shù)組下標。

你可以假設每種輸入只會對應一個答案。但是,數(shù)組中同一個元素不能使用兩遍。

示例:

給定 nums = [2, 7, 11, 15], target = 9因為 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]

代碼:

/*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* nums, int numsSize, int target, int* returnSize){if(nums==NULL) return NULL;int *res = (int*)malloc(sizeof(int)*2);*returnSize = 2;for(int i= 0;i<numsSize;i++) {for(int j = i+1;j<numsSize;j++) {if(nums[i] + nums[j] == target) {res[0] = i;res[1] = j;break;}}}return res; }

167.兩數(shù)之和II-輸入有序數(shù)組
題目:給定一個已按照升序排列 的有序數(shù)組,找到兩個數(shù)使得它們相加之和等于目標數(shù)。

函數(shù)應該返回這兩個下標值 index1 和 index2,其中 index1 必須小于 index2。

說明:
返回的下標值(index1 和 index2)不是從零開始的。
你可以假設每個輸入只對應唯一的答案,而且你不可以重復使用相同的元素。

示例:

輸入: numbers = [2, 7, 11, 15], target = 9 輸出: [1,2] 解釋: 2 與 7 之和等于目標數(shù) 9 。因此 index1 = 1, index2 = 2 。 int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){if(numbers==NULL) return NULL;int *res = (int*)malloc(sizeof(int)*2);*returnSize = 2;for(int i= 0;i<numbersSize-1;i++) {for(int j = i+1;j<numbersSize;j++) {if(numbers[i] + numbers[j] == target) {res[0] = i+1;res[1] = j+1;break;}}}return res; }

對上述兩個題目的總結(jié):
題目區(qū)別:返回的下標是否從0開始
代碼區(qū)別:
1

res[0] = i;res[1] = j;

167

res[0] = i+1;res[1] = j+1;

三數(shù)之和

15.三數(shù)之和
題目:給你一個包含 n 個整數(shù)的數(shù)組 nums,判斷 nums 中是否存在三個元素 a,b,c ,使得 a + b + c = 0 ?請你找出所有滿足條件且不重復的三元組。

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

示例:

給定數(shù)組 nums = [-1, 0, 1, 2, -1, -4],滿足要求的三元組集合為: [[-1, 0, 1],[-1, -1, 2] ]

代碼:

//先將數(shù)組進行排序,然后進行三重循環(huán)。其中,前兩重循環(huán),使用普通遍歷即可,需要做一下剪枝。 //第三重循環(huán),我這里用了二分查找(不用,或許也行),可以優(yōu)化一下速度int cmp(const void *a, const void *b) {return *(int*)a - *(int*)b; // 比較大小 }/*** 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** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {if (nums == NULL || returnSize == NULL || returnColumnSizes == NULL) {return NULL;} // 方便起見,先申請足夠的內(nèi)存int max_count = numsSize * numsSize; // 認為足夠了int **p = (int **)malloc(sizeof(int*) * max_count); if (p == NULL) { // 申請內(nèi)存是否失敗return NULL;}*returnColumnSizes = (int*)malloc(sizeof(int) * max_count);if (*returnColumnSizes == NULL) { // 申請內(nèi)存是否失敗free(p); // 釋放之前申請的內(nèi)存return NULL;}memset(*returnColumnSizes, 0, sizeof(int) * max_count);*returnSize = 0;// 從小到大排序,時間復雜度O(nlogn)qsort(nums, numsSize, sizeof(int), cmp);/* for (int i = 0; i < numsSize; i++) {printf("%d, ", nums[i]);}printf("\n"); */for (int i = 0; i < numsSize; i++) {if (nums[i] > 0) { // 剪枝continue;} if (i > 0 && nums[i] == nums[i - 1]) { // 剪枝continue;} for (int j = i + 1; j < numsSize; j++) {if (nums[i] + nums[j] > 0) { // 剪枝continue;} if (j > i + 1 && nums[j] == nums[j - 1]) { // 剪枝continue;} // 這里用二分查找,進行優(yōu)化int left = j + 1;int right = numsSize - 1;while (left <= right) {int mid = (left + right) / 2;int sum = nums[i] + nums[j] + nums[mid];// printf("[%d]%d + [%d]%d + [%d]%d = (%d-%d)%d\n", // i, nums[i], j, nums[j], mid, nums[mid], left, right, sum);if (sum == 0) { // 找到一個解p[*returnSize] = (int*)malloc(sizeof(int) * 3);if (p[*returnSize] == NULL) {return NULL;}p[*returnSize][0] = nums[i];p[*returnSize][1] = nums[j];p[*returnSize][2] = nums[mid];(*returnColumnSizes)[*returnSize] = 3;(*returnSize)++;break; // 找到則退出 } else if (sum > 0) {right = mid - 1;} else {left = mid + 1;}} }}return p; }

疑惑:不清楚下面這樣子為什么不可以
此處附上錯誤代碼:

/*** 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** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){if(nums==NULL)return NULL;int *res = (int*)malloc(3*sizeof(int));*returnSize = 3;int i,j,k;for(i=0; i<numsSize-2; i++){for(j=i+1; j<numsSize-1; j++){for(k=j+1; k<numsSize; k++){if(nums[i]+nums[j]+nums[k]==0){res[0]=i;res[1]=j;res[2]=k;break;}}}}return res;}


搜索了一下錯誤的原因:

  • LeetCode使用了AddressSanitizer檢查了是否存在內(nèi)存非法訪問。
  • 在該題目中,是因為數(shù)組訪問越界,也是絕大部分的內(nèi)存訪問題。

可是我不覺得自己for循環(huán)里有問題啊,如果大佬看到了錯誤或者有思路,愿聞詳解,本菜鳥的榮幸

四數(shù)之和

18.四數(shù)之和
題目:給定一個包含 n 個整數(shù)的數(shù)組 nums 和一個目標值 target,判斷 nums 中是否存在四個元素 a,b,c 和 d ,使得 a + b + c + d 的值與 target 相等?找出所有滿足條件且不重復的四元組。

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

示例:

給定數(shù)組 nums = [1, 0, -1, 0, -2, 2],和 target = 0。滿足要求的四元組集合為: [[-1, 0, 0, 1],[-2, -1, 1, 2],[-2, 0, 0, 2] ]

總結(jié)

以上是生活随笔為你收集整理的算法笔记-两数之和、三数之和、四数之和(LeetCode)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。