zoukankan      html  css  js  c++  java
  • leetcode-two sum

    之前是通过hash来做,O(n)。这次为了熟悉通用性的解法,通过双指针来做。时间复杂度为O(nlogn)(即sort的复杂度)。

    主要是关于sort的用法上不太熟,关于自定义sort规则。

    C++ Reference中给的示例代码如下:
     1 // sort algorithm example
     2 #include <iostream>     // std::cout
     3 #include <algorithm>    // std::sort
     4 #include <vector>       // std::vector
     5 
     6 bool myfunction (int i,int j) { return (i<j); }
     7 
     8 struct myclass {
     9   bool operator() (int i,int j) { return (i<j);}
    10 } myobject;
    11 
    12 int main () {
    13   int myints[] = {32,71,12,45,26,80,53,33};
    14   std::vector<int> myvector (myints, myints+8);               // 32 71 12 45 26 80 53 33
    15 
    16   // using default comparison (operator <):
    17   std::sort (myvector.begin(), myvector.begin()+4);           //(12 32 45 71)26 80 53 33
    18 
    19   // using function as comp
    20   std::sort (myvector.begin()+4, myvector.end(), myfunction); // 12 32 45 71(26 33 53 80)
    21 
    22   // using object as comp
    23   std::sort (myvector.begin(), myvector.end(), myobject);     //(12 26 32 33 45 53 71 80)
    24 
    25   // print out content:
    26   std::cout << "myvector contains:";
    27   for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    28     std::cout << ' ' << *it;
    29   std::cout << '
    ';
    30 
    31   return 0;
    32 }

    从中可以看到除了写compare函数外,还可以通过重载圆括号()来写函数对象。

    一开始是写了个compare函数。

    bool compare(const Node &lhs, const Node &rhs) { return lhs.val < rhs.val;
    }
    发现对于leetcode而言貌似只能提交class Solution内部的部分。而compare函数放在Solution内部就会出错,放在Solution外面就正常。为什么???
    然后就通过重载圆括号写了函数对象,顺利通过。
     1 class Solution {//two sum O(nlogn)
     2 public:
     3     struct Node{
     4         int val;
     5         int index;
     6         Node(int v, int idx) :val(v), index(idx){}
     7     };
     8     struct myclass {
     9         bool operator() (Node n1, Node n2) { return (n1.val<n2.val); }
    10     } myobject;
    11 
    12     vector<int> twoSum(vector<int> &numbers, int target) {
    13         vector<Node> a;
    14         for (int i = 0; i < numbers.size(); i++)
    15         {
    16             a.push_back(Node(numbers[i], i + 1));
    17         }
    18         sort(a.begin(), a.end(),myobject );
    19         int i = 0, j = numbers.size() - 1;
    20         vector<int> res;
    21         while (i < j)
    22         {
    23             int sum = a[i].val + a[j].val;
    24             if (sum == target)
    25             {
    26                 int minIndex = min(a[i].index,a[j].index);
    27                 int maxIndex = max(a[i].index, a[j].index);
    28                 res.push_back(minIndex);
    29                 res.push_back(maxIndex);
    30                 break;
    31             }
    32             else if (sum < target)
    33             {
    34                 i++;
    35             }
    36             else
    37             {
    38                 j--;
    39             }
    40         }
    41         return res;
    42     }
    43 };
  • 相关阅读:
    CSS复合选择器
    模块之shutil模块模块详解
    模块之sys模块详解
    模块之os模块详解
    map遍历
    java完美处理表情符
    死磕设计模式—建造者模式
    Java String getChars()方法
    Java知识系统回顾整理01基础06数组05复制数组
    Java知识系统回顾整理01基础06数组04增强型for循环
  • 原文地址:https://www.cnblogs.com/forcheryl/p/4064424.html
Copyright © 2011-2022 走看看