算法笔记-两数之和、三数之和、四数之和(LeetCode)
兩數(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
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; }疑惑:不清楚下面這樣子為什么不可以
此處附上錯誤代碼:
搜索了一下錯誤的原因:
- 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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#读写word,文段及表格
- 下一篇: 单链表--键盘输入、插入、删除、查询、输