Two Sum II

题目:

Given an array of integers, find how many pairs in the array such that their sum is bigger than a specific target number. Please return the number of pairs.

分析:

这是算法提高班的第一题,说起来蛮有意义的。

这道题目有个提示叫做用O(nlogn)的复杂度来完成,如果给这个提示则可以想到需要排序。那么排序之后怎么做呢?使用了一个two pointer的思想:

    1, 2, 3, 4, 5
1,              6
2,              7
3,              8
4,              9
5               ...

可以看出,开始让start = 0, end = size - 1, 如果start + end > target则说明end和任意组合,都满足>target, 这时候给count+=(end - start)然后end--。

一直到出现这种情况:1 + 3 = 4,不满足>target, 这时候需要start++了,并且count保持不变。

    1, 2, 3, 4, 5
1,        4      
2,              
3,              
4,              
5

给以个while(start < end)则可以保证循环不超过O(n)。

解法:

class Solution {
public:
    /**
     * @param nums: an array of integer
     * @param target: an integer
     * @return: an integer
     */
    int twoSum2(vector<int> &nums, int target) {
        // Write your code here
        if (nums.size() <= 1) {
            return 0;
        }
        sort(nums.begin(), nums.end() );
        int start = 0;
        int end = nums.size() - 1;
        int count = 0;
        while (start < end) {
            if (nums[start] + nums[end] > target) {
                count += end - start;
                end--;
            } else {
                start++;
            }
        }
        return count;
    }
};

results matching ""

    No results matching ""