• 【C语言刷LeetCode】15. 三数之和(M)


    给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。

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

    示例 1:

    输入:nums = [-1,0,1,2,-1,-4]
    输出:[[-1,-1,2],[-1,0,1]]
    示例 2:

    输入:nums = [0,1,1]
    输出:[]
    示例 3:

    输入:nums = [0,0,0]
    输出:[[0,0,0]]
     

    提示:

    3 <= nums.length <= 3000
    -105 <= nums[i] <= 105

    来源:力扣(LeetCode)
    链接:https://leetcode.cn/problems/3sum
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    一个数遍历,在后面的数中找两个数,想到滑窗,

    这道题主要考性能,所以很容易超时,必须想很多去重方法,当然先给数组排个序

    1. 当nums[i] > 0, 那就不用找了,直接break

    2. 当nums[i]跟上一个元素nums[i -1]一样,那么需要跳过

    3. 滑窗时遇到nums[j]相同时,需要跳过,j++

    4. 滑窗时遇到nums[k]相同时,需要跳过,k--

    5. C语言数组最大的大小 size * (size - 1),因为两个数确定了,这个三元组就确定了

    6. 二维数组的第二维不用一开始就申请,可以找到了再申请

    7. 因为考性能,所以二维数组就不要memset了

    8. returnColumnSizes[0][i] 的赋值放到最后,按照实际个数赋值

    9. 找到符合要求的三元组后,j++, k--

    1. int Cmp(const void *a, const void *b)
    2. {
    3. return *(int *)a - *(int *)b;
    4. }
    5. int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    6. int i, j, k;
    7. int **retarr;
    8. int icnt = 0;
    9. int sum = 0;
    10. int size = numsSize * numsSize;
    11. retarr = (int **)malloc(sizeof(int *) * size);
    12. returnColumnSizes[0] = malloc(sizeof(int) * size);
    13. qsort(nums, numsSize, sizeof(int), Cmp);
    14. for (i = 0; i < numsSize - 2; i++) { // 第一个数遍历,注意遍历边界到 numsSize - 2
    15. if (nums[i] > 0) { // 去重
    16. break;
    17. }
    18. if (i > 0 && nums[i] == nums[i - 1]) { // 去重
    19. continue;
    20. }
    21. j = i + 1;
    22. k = numsSize - 1;
    23. while (j < k) {
    24. sum = nums[i] + nums[j] + nums[k];
    25. if (sum == 0) {
    26. retarr[icnt] = malloc(sizeof(int) * 3);
    27. retarr[icnt][0] = nums[i];
    28. retarr[icnt][1] = nums[j];
    29. retarr[icnt][2] = nums[k];
    30. icnt++;
    31. while(j < k && nums[j] == nums[j + 1]) { // 去重
    32. j++;
    33. }
    34. while(j < k && nums[k] == nums[k - 1]) { // 去重
    35. k--;
    36. }
    37. j++;
    38. k--;
    39. } else if (sum < 0) {
    40. j++;
    41. } else if (sum > 0) {
    42. k--;
    43. }
    44. }
    45. }
    46. for (i = 0; i < icnt; i++) {
    47. returnColumnSizes[0][i] = 3;
    48. }
    49. *returnSize = icnt;
    50. return retarr;
    51. }

  • 相关阅读:
    第19节-PhotoShop基础课程-历史记录画笔工具
    FastAdmin表格添加统计信息
    策略验证_买入口诀_身抱多线好景出现
    Photoshop极坐标滤镜打造炫彩烟花
    解密Prompt系列11. 小模型也能COT-先天不足后天来补
    SpringBatch(10):ItemWriter详解
    电脑如何恢复误删的文件?
    ChatGPT 点燃向量数据库赛道,刚刚,Zilliz Cloud 云服务重磅发布!
    CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)C - Colorful Table
    HTML - 请你谈一谈img标签图片和background背景图片的区别
  • 原文地址:https://blog.csdn.net/jin615567975/article/details/126515816