• 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

  • 相关阅读:
    UWP取出图片主色调
    UWP上可用的GB2312编码
    嵌入的资源 和 Resource
    WPF 斜角border
    .net core初试 --- 控制台程序
    Python初学手记----在window系统中安装环境
    我的第一个网络爬虫 C#版 福利 程序员专车
    使用FFMpeg命令行录屏推rtmp流
    WPF制作表示透明区域的马赛克画刷
    WPF之坑——surface触控失灵之谜
  • 原文地址:https://www.cnblogs.com/bananaa/p/7146521.html
Copyright © 2020-2023  润新知