leetcode 2 sum& 3 sum
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 2 sum& 3 sum相关的知识,希望对你有一定的参考价值。
今天写了一个2sum和3sum问题,第一个是用哈希表解决,第二个则用排序就可以了。
在2sum的问题的时候,遇到的困难应该是每次找到数字不能是自己;有相同的数字的时候,怎么保证找的不是自己。
前者需要做一次判断,后者则需要事先观察数组中有没有sum/2的数字。整个问题在已经会使用哈希表之后就不太困难了。
在3sum问题的时候,关键应该是先进行一个排序再加上一些判断(左右夹逼,并且判断两组解不相同)。快速排序熟记了之后就好像没有那么困难了,它是一个地柜的过程。
仍然还是要给出两个代码。
这是2sum问题。
1 #include <iostream> 2 #include <map> 3 using namespace std; 4 5 int main(){ 6 map<int,int>f; 7 map<int,int>::iterator j; 8 int n;//number 9 cin>>n; 10 int m;//target 11 cin>>m; 12 int k=0; 13 int a[2]; 14 for (int i=1;i<=n;i++){ 15 int t; 16 cin>>t; 17 f[t]=i; 18 if(2*t==m){a[k]=i;k++;} 19 } 20 if(k==2){ 21 cout<<"index 1="<<a[0]<<"\\nindex 2="<<a[1]; 22 return 0; 23 } 24 for (j=f.begin();j!=f.end();j++){ 25 if (f.find(m-j->first)!=f.end()){ 26 if (j->second<f[m-j->first]){ 27 cout<<"index 1="<<j->second<<"\\nindex 2="<<f[m-j->first]; 28 return 0; 29 } 30 if (j->second>f[m-j->first]){ 31 cout<<"index 1="<<f[m-j->first]<<"\\nindex 2="<<j->second; 32 return 0; 33 } 34 if (j->second==f[m-j->first]) 35 continue; 36 } 37 } 38 return 0; 39 }
1 #define MAX 100 2 #include <iostream> 3 using namespace std; 4 5 void Quicksort(int a[], int left, int right){ 6 int i=left; 7 int j=right; 8 if (left>=right) return; 9 int temp=a[left]; 10 while(i!=j){ 11 while(i<j&&a[j]>=temp) j--; 12 if (i<j){ 13 a[i]=a[j]; 14 i++; 15 } 16 while(i<j&&a[i]<=temp) i++; 17 if (i<j){ 18 a[j]=a[i]; 19 j--; 20 } 21 } 22 a[i]=temp; 23 Quicksort(a,left,i-1); 24 Quicksort(a,i+1,right); 25 return ; 26 } 27 28 int main(){ 29 int a[MAX]; 30 int b[3]; 31 b[0]=b[1]=b[2]=-1; 32 int n;//number 33 cin>>n; 34 for (int t=1;t<=n;t++) cin>>a[t]; 35 Quicksort(a,1,n); 36 //for (int t=1;t<=n;t++) 37 //cout<<a[t]; 38 int i,j,k=n; 39 for (i=1;i<=n-2;i++){ 40 j=i+1; 41 while(j<k){ 42 //cout<<‘1‘; 43 if (a[j]+a[k]>-a[i]) { 44 k--; 45 continue; 46 } 47 if (a[j]+a[k]<-a[i]){ 48 j++; 49 continue; 50 } 51 if (a[j]+a[k]==-a[i]){ 52 if (a[i]!=b[0]||a[j]!=b[1]||a[k]!=b[2]) 53 cout<<a[i]<<‘ ‘<<a[j]<<‘ ‘<<a[k]<<‘\\n‘; 54 b[0]=a[i]; 55 b[1]=a[j]; 56 b[2]=a[k]; 57 j++; 58 k--; 59 } 60 } 61 //cout<<‘1‘; 62 } 63 return 0; 64 }
这是3sum问题。
以上是关于leetcode 2 sum& 3 sum的主要内容,如果未能解决你的问题,请参考以下文章
[LeetCode&Python] Problem 404. Sum of Left Leaves
LeetCode题解之 Continuous Subarray Sum