leetcode笔记--SUM问题

引用自 http://blog.csdn.net/wangxiaojun911/article/details/18922337,此处仅作为自己参考

1.Two SUM

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, and you may not use the same element twice.

 方法1://该算法找出排好序的vector中相加等于target的两个数值 //最小和最大相加,然后和target比较。如果和比较小,则左侧移动;如果和比较大,右侧移动

    class Solution {  
    public:  
        /*Below is the 2 sum algorithm that is O(NlogN) + O(N)*/  
        /*Alternative: hash从左往右扫描一遍,然后将数及坐标,存到map中。然后再扫描一遍即可。时间复杂度O(n)*/  
        vector<int> twoSum(vector<int> &numbers, int target) {  
            vector<int> numbersCopy;  
            for(int i = 0; i < numbers.size(); i++) numbersCopy.push_back(numbers[i]);  
              
            sort(numbersCopy.begin(), numbersCopy.end()); //O(NlogN)  
            vector<int> returnNumbers = twoSumAlgorithm(numbersCopy, target);//O(N)  
            //遍历查找返回的两个值的下标,时间复杂度为O(n);
            vector<int> returnIndexes;  
            for(int j = 0; j < returnNumbers.size(); j++)  
                for(int i = 0; i < numbers.size(); i++)//O(N)  
                    if(numbers[i] == returnNumbers[j]) returnIndexes.push_back(i + 1);  
                      
            if(returnIndexes[0] > returnIndexes[1]){  
                returnIndexes[0] = returnIndexes[0]^returnIndexes[1];  
                returnIndexes[1] = returnIndexes[0]^returnIndexes[1];  
                returnIndexes[0] = returnIndexes[0]^returnIndexes[1];  
            }  
      
            return returnIndexes;  
        }  
          
        /*Core algorithm is linear*/  
        //该算法找出排好序的vector中相加等于target的两个数值
        //最小和最大相加,然后和target比较。如果和比较小,则左侧移动;如果和比较大,右侧移动
        vector<int> twoSumAlgorithm(vector<int> &numbers, int target) {  
            int len = numbers.size();  
            vector<int> r;  
            int i = 0; int j = len - 1;  
            while(i < j){  
                int x = numbers[i] + numbers[j];  
                if(x == target){   
                    r.push_back(numbers[i]);  
                    r.push_back(numbers[j]);  
                    i++; j--;  
                }else if(x > target) j--;  
                else i++;  
            }  
            return r;  
        }  
    };  

方法2://unordered_map

2.Three SUM

原文地址:https://www.cnblogs.com/bananaa/p/7146521.html