注意:本文章内容仅提供思路,根据力扣题目做出能在vscode上运行的程序,而非力扣答案!!!
15.给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。
注意:答案中不可以包含重复的三元组。
//前两个头文件是程序需要用到的
#include <stdio.h>
#include <string.h>int main() //主程序
{
int nums[] = {-1,0,1,-1,2,4};
int ret = sizeof(nums) / sizeof(nums[0]);//
int x[100] = {0};//首先使用冒泡排序将数组数字从小到大排序出来(这样数组含有多个重复数字的时候可以
//做到很简便的查重)
//第一个for循环是需要遍历多少遍(需要遍历的次数比数组数字少1)
for(int i = 0; i < ret - 1; i++)
{
//将每一遍需要比较多少遍(需要比较的次数依次递减)//例如前面定义的数组一共有6个数,第一个数字需要比较5遍,第二个数字需要比较4遍
for(int j = 0; j < ret - i - 1; j++)
{
//对数据比较,符合后进行交换
if(nums[j] > nums[j + 1])
{
int temp = nums[j];
nums[j] = nums[j+1];
nums[j+1] = temp;
}
}
}//这一段是排序写完用来检查冒泡排序是否正确的,程序运行中不需要运行这段
// for(int i = 0; i < ret; i++)
// {
// printf("%d ",nums[i]);
// }//开始进行加减和去重
for (int i = 0; i < ret && i <= 0; i++)
{//三元组的第一个数字,如果在前面循环中已经出现过了,那么就跳过这个数字
if(nums[i] == nums[i-1])
{
continue;
}
for(int left = i + 1; left <= ret - 1; left++)
{
while (nums[left] == nums[left+1])
{
left++;
}
for(int right = left + 1; right <= ret - 1; right++)
{
if (nums[i] + nums[left] + nums[right] == 0)
{
printf("[%d,%d,%d]\n",nums[i],nums[left],nums[right]);
}
}
}
}
return 0;
}
运行结果:
[-1,-1,2]
[-1,0,1]