zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    jQuery-遍历
    jQuery-尺寸方法
    jQuery-操作css类
    jQuery-添加/删除元素
    jQuery捕获-获取DOM元素内容和属性
    Props属性
    jQuery事件
    jQuery选择器
    JQ基本选择器
    注册事件
  • 原文地址:https://www.cnblogs.com/bananaa/p/7146521.html
Copyright © 2011-2022 走看看