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 }
View Code
技术分享
 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 }
View Code

这是3sum问题。

以上是关于leetcode 2 sum& 3 sum的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode&Python] Problem 404. Sum of Left Leaves

LeetCode题解之 Continuous Subarray Sum

[LeetCode]Path Sum系列

leetcode-Minimum Path Sum-64

LeetCode题意分析&解答39. Combination Sum

[LeetCode&Python] Problem1: Two Sum