码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode 2 sum& 3 sum

时间:2016-04-06 23:13:47      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

今天写了一个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

标签:

原文地址:http://www.cnblogs.com/iamliyou/p/5361361.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!