当前位置: 首页 > news >正文

leetcode刷题日记——三数之和

[ 题目描述 ]:
在这里插入图片描述
[ 思路 ]:

  • 题目要求在数组nums中找出三个数之和为0的所有组合
  • 暴力解法:三层 for 循环求得所有情况,然后提出其中相同的情况,时间复杂度O(n3)
  • 双指针:遍历数组的每个数 nums[i],将 - nums[i] 作为 target,然后使用双指针求数组 (去除当前这个数后) 两个数的和为-target (要使用双指针前需要先对数组进行排序),即求得了和为0的三个元素,但这个数可能存在多个情况,所有还需要继续遍历数组,求得其他情况的解
  • 运行如下
    在这里插入图片描述
int compare(const void *a, const void *b) {
    return (*(int *)a - *(int *)b);
}

int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes) {
    qsort(nums, numsSize, sizeof(int), compare);
    int **result = (int **)malloc(sizeof(int *) * numsSize * numsSize);
    *returnColumnSizes = (int *)malloc(sizeof(int) * numsSize * numsSize);
    *returnSize = 0;
    for (int i = 0; i < numsSize - 2; i++) {
        if (i > 0 && nums[i] == nums[i - 1]) continue;
        int left = i + 1;
        int right = numsSize - 1;
        int target = -nums[i]; 
        while (left < right) {
            int sum = nums[left] + nums[right];
            if (sum == target) {
                result[*returnSize] = (int *)malloc(sizeof(int) * 3);
                result[*returnSize][0] = nums[i];
                result[*returnSize][1] = nums[left];
                result[*returnSize][2] = nums[right];
                (*returnColumnSizes)[*returnSize] = 3;
                (*returnSize)++;
                while (left < right && nums[left] == nums[left + 1]) left++;
                while (left < right && nums[right] == nums[right - 1]) right--;
                left++;
                right--;
            } else if (sum < target) {
                left++;
            } else {
                right--;
            }
        }
    }    
    return result;
}

[ 官方题解 ]:

  • 一、排序+双指针

相关文章:

  • 李白打酒加强版本
  • 简单括号匹配_栈
  • 代码随想录算法训练营第十四天
  • UniApp 实现兼容 H5 和小程序的拖拽排序组件
  • Django项目入门二
  • ShopXO v2.2.4开源商城手动部署(保姆级)+异常处理
  • 分支语句和循环语句
  • 蓝桥杯刷题--宝石组合
  • 【踩坑】GitHub Actions 运行的 Linux 环境中,文件名是大小写敏感的
  • 基于SpringBoot的“线上考试系统”的设计与实现(源码+数据库+文档+PPT)
  • AWS VPC深度解析:构建安全可靠的云网络基础设施
  • Java中的基本数据类型
  • HarmonyOS:组件布局保存至相册
  • repo安装配置
  • 一文读懂WPF系列之常用控件以及样式
  • Human3.6M 解析3d pose标注 h36m
  • python基础语法13-装饰器
  • 【JavaScript】十七、事件委托(冒泡阶段的利用)
  • Redux中间件原理
  • 水文-用 Coze 工作流打造你的自媒体写作工厂