LeetCode刷题15-简单-三数之和
Posted 布小禅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode刷题15-简单-三数之和相关的知识,希望对你有一定的参考价值。
☀️ 前言 ☀️
算法作为极其重要的一点,是大学生毕业找工作的核心竞争力,所以为了不落后与人,开始刷力扣算法题!
🙀 作者简介 🙀
大家好,我是布小禅,一个尽力让无情的代码变得生动有趣的IT小白,很高兴能偶认识你,关注我,每天坚持学点东西,我们以后就是大佬啦!
📢 博客主页:❤布小禅❤
📢 作者专栏:
❤Python❤
❤Java❤这是我刷第 87/100 道力扣简单题
💗 一、题目描述 💗
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]
示例2:
输入:nums = []
输出:[]
提示:
0 <= nums.length <= 3000
-105 <= nums[i] <= 105
💁 二、题目解析 💁
思 路 1 : \\color{green}{思路1:} 思路1:
\\- 空数组/元素数目小于3返回空 \\- 排序原数组 \\- 遍历排序后的数组 \\- 使用二分法找到三数之和 细节处理: \\- 当前数组大于0,表示后续没有三数之和为0,结束遍历 \\- 当前元素与上一次相等,跳过此次计算,去重
🏃 三、代码 🏃
☁️ C语言☁️
/**
* 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().
*/
/*
- 空数组/元素数目小于3返回空
- 排序原数组
- 遍历排序后的数组
- 使用二分法找到三数之和
细节处理:
- 当前数组大于0,表示后续没有三数之和为0,结束遍历
- 当前元素与上一次相等,跳过此次计算,去重
*/
/* qsort的比较函数 */
int cmp(const void* a, const void* b) {
return *(int*)a - *(int*)b;
}
int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
/* 先记录返回的行数为0 */
*returnSize = 0;
/* 输入为空、或元素个数小于3则返回NULL */
if (nums == NULL || numsSize < 3) {
return NULL;
}
/* 将nums排序为升序排列 */
qsort(nums, numsSize, sizeof(int), cmp);
/* 分配返回数组、返回数组的列数 */
int** ret = (int**)malloc(numsSize * numsSize * sizeof(int*));
*returnColumnSizes = (int*)malloc(numsSize * numsSize *sizeof(int));
/* 排序后的数组从头到尾进行遍历 */
for (int i = 0; i < numsSize; i++) {
/* 当前数组大于0,表示后续没有三数之和为0,结束遍历 */
if (nums[i] > 0) {
break;
}
/* 当前元素与上一次相等,跳过此次计算,去重 */
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
/* 定义左右指针 */
int left = i + 1, right = numsSize - 1;
/* 开始查找三数之和为0 */
while (left < right) {
int sum = nums[i] + nums[left] + nums[right];
if (sum == 0) {
ret[*returnSize] = (int*)malloc(sizeof(int) * 3);
ret[*returnSize][0] = nums[i];
ret[*returnSize][1] = nums[left];
ret[*returnSize][2] = nums[right];
/* 返回数组当前行的列数为3 */
(*returnColumnSizes)[*returnSize] = 3;
/* 返回数组的行数自加1 */
(*returnSize)++;
/* 对左右指针进行去重 */
while (left < right && nums[left] == nums[++left]);
while (left < right && nums[right] == nums[--right]);
} else if (sum < 0) {
left++;
} else {
right--;
}
}
}
return ret;
}
🌔 结语 🌔
坚持最重要,每日一题必不可少!😸
期待你的关注和督促!😛
以上是关于LeetCode刷题15-简单-三数之和的主要内容,如果未能解决你的问题,请参考以下文章