今日份 leetcode
- 217. 存在重复元素
- 167. 两数之和 II - 输入有序数组
![]()
217. 存在重复元素
提交时才发现这道题之前做过一次,但好像没发题解
解题思路
先将代码进行排序,然后逐一比较,若当前元素等于后一个,则表示存在重复元素
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| int cmp(int *x, int *y) { return *x - *y; }
bool containsDuplicate(int* nums, int numsSize) { qsort(nums, numsSize, sizeof(int), cmp); for (int i = 0; i < numsSize - 1; i++) { if (nums[i] == nums[i + 1]) { return true; } } return false; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
var containsDuplicate = function(nums) { nums.sort(); for(let i = 0; i < nums.length; i++) { if(nums[i] == nums[i + 1]) return true } return false };
|
167. 两数之和 II - 输入有序数组
解题思路
因为给定的数组是有序的,所以可以得出以下结论
左边和右边相加,如果比目标值大,说明右边的数太大了,所以往前推
左边和右边相加,如果比目标值小,说明左边的数太小了,所以往后推
左边和右边相加,如果等于目标值,说明找到了,所以返回下标 +1,一开始没看清楚题目以为是返回下标
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){ int * res = (int *) malloc (sizeof(int) * 2); int left = 0, right = numbersSize - 1; while(left < numbersSize){ if(numbers[left] + numbers[right] == target){ res[0] = left + 1; res[1] = right + 1; *returnSize = 2; return res; } if(numbers[left] + numbers[right] > target) right--; if(numbers[left] + numbers[right] < target) left++; } *returnSize = 0; return NULL; }
|
最后吐槽一下,为什么别人暴力能过,我暴力超时😭
![image.png]()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int* twoSum(int* numbers, int numbersSize, int target, int* returnSize){ int * res = (int *) malloc (sizeof(int) * 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; *returnSize = 2; return res; } } } *returnSize = 0; return NULL; }
|