zoukankan      html  css  js  c++  java
  • LeetCode-Two Sum

    题目看起来很简单,很容易想到直接排序后二分查找,时间复杂度是O(nlogn),不过要找出的是两个数在原数组中的索引,而不是这两个数本身,所以必须记录每个数原来的位置,可能有人会想到用map,由于可能有相同数值的两个数,所以map是不行的。那就用包含数和位置的struct吧,其实不用那么麻烦,直接用一个包含pair<int, int>的数组就可以了,不过注意sort的比较函数要定义到class的外部,否则调用的时候找不到函数,或者定义为类的static成员函数也是可以的。

     1 bool compare(pair<int, int> a, pair<int, int> b) {
     2     return a.first < b.first;
     3 }
     4 class Solution {
     5 public:
     6     vector<int> twoSum(vector<int> &numbers, int target) {
     7         // Start typing your C/C++ solution below
     8         // DO NOT write int main() function
     9         int length = numbers.size();
    10         int index1, index2;
    11         vector<pair<int, int>> numvec(length);
    12         for (int i = 0; i < length; i++) {
    13             numvec[i] = pair<int, int>(numbers[i], i);
    14         }
    15         sort(numvec.begin(), numvec.end(), compare);
    16         for (int i = length - 1; i >= 0; --i) {
    17             index1 = binarysearch(numvec, target - numvec[i].first);
    18             if (index1 != -1) {
    19                 index2 = numvec[i].second;
    20                 break;
    21             }
    22         }
    23         vector<int> ret;
    24         if (index1 > index2) {
    25             int tmp = index1;
    26             index1 = index2;
    27             index2 = tmp;
    28         }
    29         ret.push_back(index1 + 1);
    30         ret.push_back(index2 + 1);
    31         return ret;
    32     }
    33     int binarysearch(vector<pair<int, int>> &numvec, int key) {
    34         int loc = -1;
    35         int low = 0;
    36         int high = numvec.size() - 1;
    37         int middle;
    38         if (key > numvec[high].first || key < numvec[low].first) {
    39             return loc;
    40         }
    41         while (low <= high) {
    42             middle = (low + high) / 2;
    43             if (numvec[middle].first == key) {
    44                 return numvec[middle].second;
    45                 break;
    46             }
    47             else if (numvec[middle].first < key) {
    48                 low = middle + 1;
    49             }
    50             else {
    51                 high = middle - 1;
    52             }
    53          }
    54         return loc;
    55     }
    56 };
  • 相关阅读:
    浅谈display:flex
    MVVM
    HDFS 伪分布式集群搭建
    HDFS入门
    Hadoop-HDFS
    Hadoop介绍
    大数据-高并发Nginx
    大数据-高并发LVS3Keepalived
    大数据-高并发LVS2实验
    大数据-高并发LVS1
  • 原文地址:https://www.cnblogs.com/chasuner/p/twosum.html
Copyright © 2011-2022 走看看