题目:给一个整数数组,判断是否有三元组[数字[i],数字[j],数字[k]]满足i != j、i != k和j!= K,这也满足名称[i]+名称[j]+名称[k] == 0。要求您返回所有三元组,和为零且没有重复。 注意:答案中不应包含重复的三元组。
案例:
Input: nums = [-1,0,1,2, -1, -4]
Output: [[-1, -1,2], [-1,0,1]]
explain:
nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0.
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0.
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0.
The different triples are [-1,0,1] and [-1, -1,2].
解题过程:
本人C++小白,看了网上同题解析的大佬的代码没太懂,就想着用笨方法写了一下,欢迎参考指正,共同进步!
主要过程是用vector输入任意长度数组,然后运用三个for循环录入到一个新的二维数组里,值得注意的是,为了防止产生相同数组的三元组,我用了一个target变量去标记每一次可录入的数组与已有数组是否相同,如果相同就+1,直到完全相同也就是target=3就放弃录入该数组。break语句就是为了防止‘已经重合的相同的数组’与‘非相同的另一组数组’比较后被误录入。
最后输出写的很繁琐,我是为了和答案的格式重合,如果不介意也可以套两个循环输出二维数组。
我这个代码主要也只用了循环嵌套穷举,理解应该没啥难度,如果有错误或者改进的地方欢迎评论区留言!
代码贴在这里:
#include <iostream> #include <vector> int main(){ std::vector<int> nums; int num; std::cout<<"Please enter your array to find triple combination. Enter to quit.\n"; while (std::cin>>num) { nums.push_back(num); if (std::cin.get() == '\n') break; } std::vector<std::vector<int>> result; for (int i=0; i<nums.size(); i++) { for (int j = i + 1; j < nums.size(); j++) { for (int k = j + 1; k < nums.size(); k++) { if (nums[i] + nums[j] + nums[k] == 0) { std::vector<int> sub_result; sub_result.push_back(nums[i]); sub_result.push_back(nums[j]); sub_result.push_back(nums[k]); if(result.size()==0){ result.push_back(sub_result); } else{ for (int m = 0; m < result.size(); m++) { int target = 0; for (int n = 0; n < 3; n++) { if (result[m][n] == nums[i] || result[m][n] == nums[j] || result[m][n] == nums[k]) target++; } if(target==3) break; else result.push_back(sub_result);// 将子数组存入结果三元组数组 } } } } } } std::cout<<"["; for (int i=0;i<result.size();i++){ std::cout<<"["; for (int j=0;j<3;j++){ if(j<2) std::cout<<result[i][j]<<','; else std::cout<<result[i][j]; } if(i<result.size()-1) std::cout<<"]"<<','; else std::cout<<']'; } std::cout<<"]"; return 0; }