当日记写吧
这个题简直做的要崩溃了 因为我没学c++ 所以准备全部都用c语言打 然后便开始了我的c语言打这个题的历程
这个题的算法跟那个啥
这个题很类似哈 3 sum closet 都是在o(n3)的基础上优化到o(n2)
引用一下别人教我的聊天记录
先排序。 然后以
i为基准,j、k代表后面两个数。 res保留当前最接近的值,以此遍历所有的三元组
大了就缩小k 小了就放大j
因为是排好序的
这样可以遍历完吗 那个j和k
他
可以。因为i遍历完了
我
i肯定可以遍历完
他
那虽然不能遍历所有的三元组
我
那 k 和j 可以吗
他
但是 没遍历的都没用的
我
为毛
他
k、j是根据 min和res的大小关系 调节的 不能遍历所有的
我
举个例子
他
1 2 3 4 5 6 7
他
target = 8 (就假设我想找 1 3 4)
他
(from 1) i= 1 j = 2 k = 7
他
现在发现 1 2 7 比target大 所以我们要降低 当前三元组的大小 也就是 减小k(已排序)
他
也就说明 不会出现 1 3 7 这样的三元组(因为k已经降到6.。。。le )
我
哦哦 那为什么1,3,7不会是我想要的结果呢
我
1 2 7都比target大了 还会 1 3 7?
他
哦哦哦
我
搞反了
他
j+1导致三元组变大 k-1导致三元组变小
结合代码看应该就能看懂了
然后继续讲我艰苦的历程
算法是这个算法 ,可能有些细节没有优化,但是总是报一些奇奇怪怪的错误
代码如下
#include<stdio.h>
#include<stdlib.h>
int cmp(const void*a, const void* b)
{
return *(int*)a-*(int*)b;
}
int** threeSum(int* nums, int numsSize, int* returnSize) {
int **res;
int count=-1;
res=(int**)malloc(sizeof(int*)*numsSize);
for(int i=0;i<=numsSize-1;i++)
res[i]=(int*)malloc(sizeof(int)*3);
qsort(nums, numsSize, sizeof(int), cmp);
for(int i=0;i<=numsSize-3;i++)
{
int j=i+1; int k=numsSize-1;
while(k!=j){
if(nums[i]+nums[j]+nums[k]>0)
k--;
else if(nums[i]+nums[j]+nums[k]<0)
j++;
else if(nums[i]+nums[j]+nums[k]==0)
{
count++;
res[count][0]=nums[i];
res[count][1]=nums[j];
res[count][2]=nums[k];
j++;
}
}
}
//printf("count:%d\n",count);
returnSize=(int*)malloc(sizeof(int));
*returnSize=count+1;
return res;
}
比如
前前后后一共弄了一个上午加下午(除了睡了几小时加看了部2h的电影) hhh 暑假比较水
然后陪同学出去玩了两天 今天稍微学习了下 c++ 然后终于ac了 好感动
#include<iostream>
#include<vector>
#include<algorithm>
using namespacestd;
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) { //cout<<'0';
vector<vector<int>> res;
sort(nums.begin(),nums.end());
int numsSize=(int)nums.size();
int a=-10000000,b=-10000000,c=-10000000;
for(int i=0;i<=numsSize-3;i++)
{
if(nums[i]>0)break;
if(i>0&&nums[i]==nums[i-1])
continue;
int j=i+1;int k=numsSize-1;
while(j!=k){
if(nums[i]+nums[j]+nums[k]>0){
k--; //cout<<'0';
}
elseif(nums[i]+nums[j]+nums[k]<0){
j++; //cout<<'1';
}
elseif(nums[i]+nums[j]+nums[k]==0)
{ //cout<<'2';
if(nums[i]!=a||nums[j]!=b||nums[k]!=c){
vector<int> n;
n.push_back(nums[i]); a=nums[i]; //cout<<nums[i];
n.push_back(nums[j]); b=nums[j]; //cout<<nums[j];
n.push_back(nums[k]); c=nums[k]; //cout<<nums[k];
res.push_back(n);
}
j++;
}
}
}
return res;
}
};
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums,int target) { //cout<<'0';
vector<vector<int>> res;
sort(nums.begin(),nums.end());
int numsSize=(int)nums.size();
int a=-10000000,b=-10000000,c=-10000000,d=-10000000;
for(int i=0;i<=numsSize-4;i++)
{
int lastnumsm=-10000000;
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target)
break;
if(i>0&&nums[i]==nums[i-1])
continue;
for(int m=i+1;m<=numsSize-3;m++){
if(nums[m]==lastnumsm)
continue;
else
lastnumsm=nums[m];
int j=m+1; int k=numsSize-1;
while(j!=k){
if(nums[i]+nums[m]+nums[j]+nums[k]>target){
k--; //cout<<'0';
}
else if(nums[i]+nums[m]+nums[j]+nums[k]<target){
j++; //cout<<'1';
}
else if(nums[i]+nums[m]+nums[j]+nums[k]==target)
{ //cout<<'2';
if(nums[i]!=a||nums[m]!=b||nums[j]!=c||nums[k]!=d){
vector<int> n;
n.push_back(nums[i]); a=nums[i]; //cout<<nums[i];
n.push_back(nums[m]); b=nums[m]; //cout<<nums[m];
n.push_back(nums[j]); c=nums[j]; //cout<<nums[j];
n.push_back(nums[k]); d=nums[k];
res.push_back(n);
}
j++;
}
}
}
}
return res;
}
};