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问题。

时间: 2024-12-29 01:10:12

leetcode 2 sum& 3 sum的相关文章

[LeetCode]Count of Range Sum

题目:Count of Range Sum Given an integer array nums, return the number of range sums that lie in [lower, upper] inclusive.Range sum S(i, j) is defined as the sum of the elements in nums between indices i and j (i ≤ j), inclusive. Note:A naive algorithm

LeetCode --- 64. Minimum Path Sum

题目链接:Minimum Path Sum Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 这道题的要求是在m*n

【Leetcode】Minimum Path Sum

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path. Note: You can only move either down or right at any point in time. 思路:简单的动态规划题目,设f(m, n)为从(0, 0)到达(m

leetcode --day12 Surrounded Regions &amp; Sum Root to Leaf Numbers &amp; Longest Consecutive Sequence

1.  Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A region is captured by flipping all 'O's into 'X's in that surrounded region. For example, X X X X X O O X X X O X X O X X After running your fu

leetcode 练习1 two sum

leetcode 练习1  two sum [email protected] 问题描述 Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution. Example: Given nums = [2, 7, 11, 15

[LeetCode] Minimum Size Subarray Sum 解题思路

Given an array of n positive integers and a positive integer s, find the minimal length of a subarray of which the sum ≥ s. If there isn't one, return 0 instead. For example, given the array [2,3,1,2,4,3] and s = 7,the subarray [4,3] has the minimal

leetcode第一刷_Combination Sum Combination Sum II

啊啊啊啊,好怀念这种用递归保存路径然后打印出来的题目啊,好久没遇到了. 分了两种,一种是可以重复使用数组中数字的,一种是每个数字只能用一次的.其实没有多大区别,第一种每次进入递归的时候都要从头开始尝试,第二种要找一个标记的数组,把已经用到过的排除掉,就像生成全排列时的做法一样.跟我一样用引用保存中间结果的话,要注意回退的情况.第二种回退时,要把用到的那个数也恢复为可用,就完全像全排列时做的一样.破例贴两个题的代码,因为他们是在是不值得用两片文章来写. class Solution { publi

【一天一道LeetCode】#113. Path Sum II

一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given sum. For example: Given the below binary tree and sum = 22,

leetcode第一刷_Path Sum II

测试策略:静态测试还是动态测试? [对话场景] 成功发布某个软件版本之后,项目团队召开了项目的经验教训总结大会.在会议期间,项目经理小项和测试经理小测进行了如下的对话: 小项:"小测,我们的项目时间压力很大,测试执行是我们的关键路径,测试团队是否可以在测试执行阶段投入更多的人力和物力?"限定时间和人力资源同等条件. 小测:"啊!假如增加我们的测试执行时间,在整个周期不变的情况下,我们就需要压缩前期的学习和评审投入的时间和工作量,是吗?" 小项:"是的,你看

[LeetCode] Maximum Size Subarray Sum Equals k 最大子数组之和为k

Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If there isn't one, return 0 instead. Example 1: Given nums = [1, -1, 5, -2, 3], k = 3, return 4. (because the subarray [1, -1, 5, -2] sums to 3 and is th